Dúvidas com equals e toString

Oi gente, to com dúvidas, e as apostilas não resolvem tudo… rs rs… enfim acho melhor escutar de pessoas que ja tem experiência do que só ver o basicão das apostilas,minha dúvida maior é com relação a dois métodos: toString e equals, ambos da classe Object se não me engano, eu não sei onde posso usa-los e onde NÃO posso de jeito nenhum, olhem este código:

[code]public abstract class Funcionario {

public abstract double Calcular();

}
[/code]

[code]public class Celetista extends Funcionario {

private double faltas;
private double salariobase;

public Celetista (double faltas, double salariobase) {
this.faltas=faltas;
this.salariobase=salariobase;
}

public double Calcular() {
	return salariobase-faltas*salariobase/30.0;		
}

public String toString(){
    return String.format("%f%f",faltas,salariobase);	
}

}[/code]

[code]public class Horista extends Funcionario {

private double horas;
private double valorhora;

public Horista (double horas, double valorhora) {
this.horas=horas;
this.valorhora=valorhora;
}

public double Calcular() {
	return horas*valorhora;		
}

public String toString(){
    return String.format("%f%f",horas,valorhora);	
}

}[/code]

[code]import java.util.Scanner;

public class TesteFuncionario {

public static void main(String[] args) {

Scanner entrada = new Scanner (System.in);
Funcionario h;
Funcionario c;

System.out.println(“Dados Horista”);
double horasDouble.parse Double (entrada.nextLine());

double valorhoraDouble.parse Double (entrada.nextLine());

h = new Horista (horas,valorhora);
System.out.println (h.Calcular());
System.out.println(h);
}
}[/code]

Obrigadinha pela ajuda!
beijokas

Boa tarde!

A sua dúvida é em relação ao seu código? No sentido de onde nele não deve usar o toString e o equals?
Fiquei na dúvida sobre exatamente o que você quer :slight_smile:

Ali, você sabe que está sobrescrevendo o método toString() da classe Object, não seria exatamente isso que você queria?! :slight_smile:

Bom, coloquei o código pq era o único que eu tinha feito em aula, enfim, tendo um código com superclasse, e subclasse e mais o main, gostaria de saber um “padrão” de onde eu posso usar e o mais importante, onde não posso usar esses métodos nas classes, não sei se fui clara.
Obrigada!

Particularmente, eu diria que trata-se de uma questão um pouco complicada, talvez, dizer exatamente em qual momento você não pode sobrescrever estes métodos.
Vamos supor que você queira utilizar o equals para comparar um campo de dentro do seu objeto e não o objeto em si, neste caso, você iria sobrescrever o método equals de acordo com a sua necessidade.

Acredito que esta seja a palavra chave, necessidade. Você deve avaliar se é necessário ou não sobrescrever estes métodos, já que você tem o conhecimento de como eles funcionam.
No exemplo que deu, ao invés de utilizar o toString() de Object, foi sobrescrito de forma a apresentar uma necessidade para este caso.

Na minha humilde opinião, vai depender muito da sua aplicação, o que ela envolve, objetivo entre outros.
Ajudei ou compliquei? rs

Abraços.

Você sobrescreve o toString() quando você precisará que seu objeto seja constantemente traduzido para uma String ao longo de sua aplicação.

No seu caso, por exemplo, poderá haver várias situações em que o usuário queira ver na tela uma lista com os dados de um funcionário, ou os dados de um funcionário em particular. Nos dois casos, por várias vezes você precisará de um código assim:

[code]Funcionario funcionario = new Celetista();

(…)

System.out.println(funcionario);[/code]

Nesse caso, a JVM chamará o método toString() da classe Funcionario (que, como não é sobrescrito, é o herdado de Object), e imprimirá seu retonro no método println(). Porém sua implementação padrão irá imprimir uma string muito estranha.

Você até poderia formatar a saída desse jeito:

System.out.println("Funcionário:"); System.out.println("Nome: " + funcionario.getNome()); System.out.println("Salário-base: " funcionario.getSalarioBase());

…mas imagina repetir esse código por todas as vezes que precisar fazer isso!!!

Além disso, usando o exemplo do seu código, visualizar os dados de um celetista é diferente de um horista. Vamos supor que exista um trecho do programa em que você precisará imprimir os dados, mas não sabe de antemão se o funcionário analisado será um celetista ou um horista. Como você faria isso?

Pra ambos os casos, o ideal é sobrescrever o toString() das classes:

@Override public String toString(){ return "Nome: " + this.nome + "\nSalário-base:" + this.salarioBase; }

Quanto ao equals(), você deverá sobrescrevê-lo quando a definição do que é um objeto “igual a outro” precisa ser explicitada por você.

Por exemplo, no seu código: o que determina que um funcionário “é igual” a outro?

Isso vai depender das regras de negócio de sua aplicação. Por exemplo, vamos supor que na sua aplicação seja válido ter dois objetos distintos representando um mesmo funcionário; digamos, um representando os rendimentos desse funcionário em um mês, e outro representando seu rendimentos do mês anterior, no intuito de gerar relatórios. Como você determinaria que esses dois objetos se tratam do mesmo funcionário?

Essa questão, um tanto “filosófica”, é crucial para o seu sistema e, por isso, não pode ser deixado “ao sabor” da JVM.

Você poderá decidir que o critério para isso é ter o atributo “nome” igual. Assim, de dois objetos Funcionario tiverem o mesmo nome, eles serão considerados referentes ao mesmo funcionário e, portanto, serão “iguais”.

Programaticamente, ficaria asism:

@Override public boolean equals(Funcionario f){ return f.getNome().equals(this.nome); }

Obrigada!

thiagobaptista e nel: ajudaram bastante a clarear as idéias =)