package br.com.caelum.fj11.modelo;
import javax.management.RuntimeErrorException;
import br.com.caelum.fj11.excecao.ValorInvalidoException;
//public abstract class Conta {
public abstract class Conta implements Comparable<Conta> {// este formato significa que Conta pode ser classificada
// private double saldo;
protected double saldo;
private int numero;
private String nome;
public double getSaldo() {
return this.saldo;
}
public void setSaldo(double saldo) {
this.saldo = saldo;
}
public String toString() {
return "esse objeto é uma conta com saldo R$" + this.saldo;
}
public int getNumero() {
return this.numero;
}
public int setNumero(int numero) {
return this.numero;
}
public String getNome() {
return this.nome;
}
public String setNome(String nome) {
return this.nome;
}
/**
* realiza um saque na conta dado o valor passado
* @param valor_saque valor a ser sacado
* @return
* @throws Exception Excption caso saldo seja insuficiente
*/
public boolean saca(double valor_saque) throws Exception {
if (this.saldo < valor_saque) {
//return false;
throw new SaldoInsuficienteException(saldo);
}
else {
this.saldo = this.saldo - valor_saque;
return true;
}
}
// public void deposita(double valor_dep) {//use este formato quando a classe filha de RuntimeException
public void deposita(double valor_dep) throws ValorInvalidoException {//use este formato quando a classe filha de Exception
// if (valor_dep > 0) {// neste formato utiliza a exeption do java
// this.saldo += valor_dep;
// }
// else {
// throw new IllegalArgumentException("Você tentou depositar" + " um valor negativo");
// }
if (valor_dep > 0) {// neste formato utiliza a exeption pelo programador
this.saldo += valor_dep;
}
else {
throw new ValorInvalidoException(valor_dep);
}
}
/**
* atualiza nome e numero de conta
*
*/
public void idConta(int numero, String nome) {
this.numero = numero;
this.nome = nome;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
result = prime * result + numero;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Conta other = (Conta) obj;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
if (numero != other.numero)
return false;
return true;
}
public int compareTo(Conta outra) {
if(this.saldo < outra.saldo) return -1;
if(this.saldo > outra.saldo) return 1;
return 0;
}
//public void atualiza(double taxa) {
// this.saldo += (this.saldo * taxa);
// };
abstract public void atualiza(double taxa);
}
----
package br.com.caelum.fj11.modelo;
public class ContaCorrente extends Conta implements Tributavel {
public ContaCorrente(int numero, String nome) {
// TODO Auto-generated constructor stub
return;
}
public void atualiza(double taxa) {
this.saldo += this.saldo * taxa * 2;
}
@Override
public double calculaTributos() {
return this.getSaldo() * 0.01;
}
}
----
package Testes;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import br.com.caelum.fj11.excecao.ValorInvalidoException;
import br.com.caelum.fj11.modelo.Conta;
import br.com.caelum.fj11.modelo.ContaCorrente;
public class TestaColecoes1 {
public static void main(String[] args) {
// utilizando a interface List com LinkedList
//a interface list permite duplicidade de dado
List<String> nomes = new LinkedList<String>();
nomes.add("Mauricio");
nomes.add("Guilherme");
nomes.add("Guilherme");
System.out.println(nomes.get(1));
System.out.println(nomes.get(2));
System.out.println(nomes.size());
// Utilizando o metodo Set
// este metodo não permite duplicidade de dados
//evita duplicidade
Set<String> nomes1 = new HashSet<String>();
nomes1.add("Mauricio");
nomes1.add("Guilherme");
nomes1.add("Guilherme");
System.out.println(nomes1.size());
//utilizando o método set
Set<Conta> contas = new HashSet<Conta>();
ContaCorrente c1 = new ContaCorrente(1, "Mauricio");
try {
c1.deposita(2000);
}
catch (ValorInvalidoException e) {
System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
}
ContaCorrente c2 = new ContaCorrente(2, "Guilherme");
try {
c2.deposita(1000);
}
catch (ValorInvalidoException e) {
System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
}
contas.add(c1);
contas.add(c1);
contas.add(c2);
System.out.println("Quantidade de contas " + contas.size());
// não entendi porque esta listado 1 onde devertia listar 2
//utilizando classe Mapa
Map<String, Conta> contas1 = new HashMap<String, Conta>();
ContaCorrente c3 = new ContaCorrente(1, "Mauricio");
try {
c1.deposita(2000);
}
catch (ValorInvalidoException e) {
System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
}
ContaCorrente c4 = new ContaCorrente(2, "Guilherme");
try {
c2.deposita(1000);
}
catch (ValorInvalidoException e) {
System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
}
contas1.put("diretor", c1);
contas1.put("gerente", c2);
System.out.println("Diretor " + contas1.get("diretor").getSaldo());
System.out.println("Gerente " + contas1.get("gerente").getSaldo());
System.out.println("Quantidade de contas " + contas.size());
}
}
Não consegui entender, o que fiz de errado, na utilização do método "Set contas = new HashSet();"
Na metodo hashCode, na classe Contas, utilizei como base nome e numero e mesmo enviando informações diferente sempre retona 1 como quantidade de contas
Nomes Guilherme Guilherme 3 2
Contas Quantidade de contas 1 Diretor 4000.0 Gerente 2000.0 Quantidade de contas 1