Boa tarde, pessoal!
Eu estava resolvendo os exercícios do capítulo 3 (Assignments) e, logo no exercício 2, me deparei com a seguinte questão:
Given:class CardBoard { Short story = 5; CardBoard go(CardBoard cb) { cb = null; return cb; } public static void main(String[] args) { CardBoard c1 = new CardBoard(); CardBoard c2 = new CardBoard(); CardBoard c3 = c1.go(c2); c1 = null; // do Stuff } }When // doStuff is reached, how many objects are eligible for GC?
A. 0
B. 1
C. 2
D. Compilation fails.
E. It is not possible to know.
F. An exception is thrown at runtime.
Seguindo o meu raciocínio (segundo a seqüência do código):
- Um objeto CardBoard é criado e referenciado por c1. A variável de referência story aponta para um objeto Short de valor 5;
- Outro objeto CardBoard é criado e referenciado por c2. A variável de referência story desse novo objeto aponta para o mesmo objeto Short, de acordo com a regra citada na página 236, que diz que o código abaixo é válido:
Short s1 = 5;
Short s2 = 5;
System.out.println(s1 == s2); // Imprime true, o que significa que s1 e s2 apontam para o mesmo objeto
- O método go(CardBoard) é chamado, com uma cópia da variável de referência c2;
- c2, portanto, continua apontando para o mesmo CardBoard;
- c3 não aponta para nenhum objeto;
- c1 não aponta para nenhum objeto, portanto, como não é referenciado por mais nenhuma variável, o objeto apontado por c1 fica elegível para o Garbage Collector;
- Mesmo se c1 for coletado, o Short para o qual c1.story apontava não fica elegível, pois c2.story ainda aponta para esse objeto!
- Portanto, a resposta correta, seguindo esse raciocínio, é a resposta B (1)
Entretanto, a resposta correta segundo o livro é a resposta C (2), pois, segundo o livro, o objeto Short também seria elegível.
Colegas de comunidade, vocês concordam comigo?


