Dúvida no retorno de Objetos[RESOLVIDO]

4 respostas
PaduaAlves

Boa tarde!

Estou lendo o livro Java Efetivo e no primeiro capítulo o autor recomenda que, sempre que possível, usar métodos estáticos para a fabricação de objetos ao invés de usar construtores. Ele cita ainda que uma das vantagens de se usar classes de fabricação é que o método estático sempre retorna o mesmo objeto. Curioso com relação a isso, resolvi fazer um teste. Tenho 2 classes.

public class TestaRetorno {

	public static String testandoRetornoMetodo() {
		return new String("Teste");
	}

	public static Object testandoRetornoMetodo2() {
		return new Object();
	}

}

e

public class Main {
	public static void main(String[] args) {

		String testeA = TestaRetorno.testandoRetornoMetodo();
		String testeB = TestaRetorno.testandoRetornoMetodo();

		Object testeC = TestaRetorno.testandoRetornoMetodo2();
		Object testeD = TestaRetorno.testandoRetornoMetodo2();

		if (testeA.equals(testeB)) {
			System.out.println("Mesmo objeto");
			System.out.println(testeA);
			System.out.println(testeB);
		} else {
			System.out.println("Objeto diferente");
			System.out.println(testeA);
			System.out.println(testeB);
		}

		if (testeC.equals(testeD)) {
			System.out.println("Mesmo objeto");
			System.out.println(testeC);
			System.out.println(testeD);
		} else {
			System.out.println("Objeto diferente");
			System.out.println(testeC);
			System.out.println(testeD);
		}
	}
}

Executando a classe principal, a saida no console é:

Mesmo objeto
Teste
Teste
Objeto diferente
java.lang.Object@19821f
java.lang.Object@addbf1

A minha dúvida é: Pq o método que retorna String sempre me devolve o mesmo objeto e o método que retorna Object sempre cria um nobo objeto? Os dois métodos tem implementações idênticas e divergem apenas quanto ao tipo de dado, logo o comportamente deveria ser igual.

4 Respostas

Flavio_Luiz

Vixi kra sua pergunta é tema de certificação…
Você tem um objeto String com um valor “Teste”, ao usar o metodo equals vc comprar o valor desses objetos, isso só é possivel afirma por causa que vc esta usando a classe String. Pois se vc estive usando qualquer outra classe ate msm não seria possivel, ao menos que você sobreescrve-se o método equals,. Pois o equals padrão faz a comparação do endenreço de memório da JVM.
Essa compraração é feito com o objeto do tipo Object, ele simplesmente compara o endereço de memória, o retorno q vc tem ai dos Object é justamente o endereço de memória na JVM

PaduaAlves

Mas se o retorno do método public static Object testandoRetornoMetodo2() é sempre o mesmo objeto, então as duas referências deveria armazenar o mesmo endereço de memória. Então pq o resultado do teste retorna que são objetos diferentes?

Flavio_Luiz

Então…
na realidade vc cria um novo objeto com o new…
cada vez q vc faz isso é criado um novo objeto na JVM é por isso a diferença…
para vc retornar o msm objeto sempre… vc precisa criar um singleton

http://pt.wikipedia.org/wiki/Singleton

PaduaAlves

Agora entendi cara. Valeu!

Criado 28 de maio de 2010
Ultima resposta 28 de mai. de 2010
Respostas 4
Participantes 2