Na classe Jogador
vamos acrescentar 3 métodos que, quando invocados sobre um dado jogador, devolvem a sua representação textual, constroem e devolvem uma cópia sua e decidem se é igual a um dado jogador.
toString
Quando imprimimos um objeto usando System.out.println
ou System.out.print
, o método toString
é invocado automaticamente sobre esse objeto.
Em cada classe há um método toString
acessível, mesmo quando não está explicitamente definido na classe (como é o caso da classe Jogador
).
Este método toString
, quando invocado sobre um dado objeto, retorna a representação desse objeto em formato de string.
Este método está acessível em todas as classes porque é “herdado” da classe Object
(este é um tópico mais avançado, que não exploraremos aqui).
A versão por omissão do método toString
, herdada por toda e qualquer classe, retorna
Já vimos o resultado deste método no início da secção 10.7.: instrução System.out.println(meuJogador)
invoca automaticamente o método toString
sobre o objeto meuJogador
e é a string resultante dessa invocação que é escrita no ecrã – "Jogador@677327b6".
Quando construímos uma classe, podemos redefinir o comportamento deste método, fazendo com que devolva uma representação textual do objeto mais apropriada ao que queremos.
Na classe Jogador
, poderíamos ter o seguinte método toString
:
/**
* Representacao textual deste jogador
*/
public String toString () {
StringBuilder sb = new StringBuilder();
sb.append("Nome: " + this.nome);
sb.append(" Pontuacao: " + this.pontuacao);
sb.append(" Maximo numa soh jogada: " + this.maximoJogada);
return sb.toString();
}
Agora, existindo este método na classe Jogador
, o output resultante da instrução System.out.println(meuJogador)
, na nossa classe ClienteDeJogador
, seria:
xxxxxxxxxx
Nome: Maria Pontuacao: 14 Maximo numa soh jogada: 9
igualJogador
Existem duas noções de igualdade entre objetos:
O operador ==
testa a identidade. Já estudámos este assunto.
No que diz respeito à equivalência, não há nenhum operador que a teste, porque o significado de equivalência depende do tipo específico dos objetos em questão.
Em vez disso, todas as classes têm acessível um método de nome equals
, com o propósito de definir a equivalência.
Tal como com o método toString
, o método equals
deveria ser redefinido nas novas classes, porque
No entanto, porque o conceito de equivalência envolve uma série de conceitos mais avançados, não trataremos aqui da redefinição do método equals
.
Em vez disso, criaremos um método de nome igualJogador
que tem um parâmetro do tipo Jogador
e devolve true
se os atributos do objeto corrente (this
) e os do objeto dado como parâmetro têm valores iguais:
xxxxxxxxxx
/**
* Este jogador eh igual a outro?
* @param outro O outro jogador
* @return true se os atributos deste jogador sao iguais aos do outro
* @requires outro != null
*/
public boolean igualJogador (Jogador outro) {
boolean iguais = this.nome().equals(outro.nome()) &&
this.pontuacao() == outro.pontuacao() &&
this.maximoNumaJogada() == outro.maximoNumaJogada();
return iguais;
}
As seguintes instruções, se acrescentadas à classe ClienteDeJogador
, resultariam no output “Sao iguais!”
xxxxxxxxxx
if(meuJogador.igualJogador(copiaJogador)){
System.out.println("Sao iguais!");
} else {
System.out.println("Sao diferentes!");
}
copia
A tarefa de criar uma cópia de um dado objeto deve ser dada ao próprio objeto, porque é ele que possui a informação necessária. Então adicionamos este método à classe Jogador
:
x/**
* Uma copia deste jogador
* @return Um novo jogador que eh uma copia deste jogador
*/
public Jogador copia () {
return new Jogador(this.nome, this.pontuacao, this.maximoJogada);
}
Agora, sempre que uma classe cliente precisa de criar uma cópia de um objeto do tipo Jogador
, basta usar este método, como por exemplo, na nossa classe ClienteDeJogador
:
xxxxxxxxxx
Jogador copiaJogador = meuJogador.copia();
Mais para a frente neste livro veremos outra forma de criar um clone de um objeto.
Anterior: 10.7. Imprimir, duplicar e comparar objetos – como NÃO fazer!
Seguinte: 10.9. A classe Jogador completa