Possível erro no livro da Kathy Sierra (SCJP)  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
felipealbuquerque
JavaGuru
[Avatar]

Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline

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:

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):

1. Um objeto CardBoard é criado e referenciado por c1. A variável de referência story aponta para um objeto Short de valor 5;
2. 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:


3. O método go(CardBoard) é chamado, com uma cópia da variável de referência c2;
4. c2, portanto, continua apontando para o mesmo CardBoard;
5. c3 não aponta para nenhum objeto;
6. 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;
7. 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!
8. 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?

Felipe de Alencar Albuquerque
[MSN]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Você está certo - é a pegadinha em que o revisor do código caiu. Se o código original lesse:

Short story = 12345;

aí teríamos 2 objetos disponíveis para garbage collection.

[WWW]
marcioa1
Virtual Machine Man
[Avatar]

Membro desde: 29/11/2003 12:52:10
Mensagens: 736
Localização: Valinhos-SP
Offline

Jé fazem tres anos que me certifiquei, de forma que estou um pouco enferrujado.

Os objetos C2 e C3 não seriam igual a null ?

[editado] Pensando melhor, C2 não é null não [/editado]

Márcio

This message was edited 1 time. Last update was at 13/12/2007 16:37:14


SCJP 1.4,
[Email]
pardal_nb
Virtual Machine Man

Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline

o livro esta certo...

existem 2 objetos...

vc acertou q o C1 está sujeito ao coletor, SÓ QUE, dentro do seu objeto C1, vc tem uma variavel de instancia q utiliza de um wrapper...entao, assim como vc está deixando o C1 para o GC, vc tb está deixando a referencia do wrapper, SHORT

ok!?
marcioa1
Virtual Machine Man
[Avatar]

Membro desde: 29/11/2003 12:52:10
Mensagens: 736
Localização: Valinhos-SP
Offline

pardal_nb wrote:o livro esta certo...

existem 2 objetos...

vc acertou q o C1 está sujeito ao coletor, SÓ QUE, dentro do seu objeto C1, vc tem uma variavel de instancia q utiliza de um wrapper...entao, assim como vc está deixando o C1 para o GC, vc tb está deixando a referencia do wrapper, SHORT

ok!?


????????

Qual o nome desta referência do wrapper ? O que é referÊncia do wapper ? Quem é o wapper ?

???
Márcio

SCJP 1.4,
[Email]
dreamspeaker
GUJ Ranger
[Avatar]

Membro desde: 22/04/2003 10:09:58
Mensagens: 752
Localização: SP - Capitar
Offline

pardal_nb wrote:o livro esta certo...

existem 2 objetos...

vc acertou q o C1 está sujeito ao coletor, SÓ QUE, dentro do seu objeto C1, vc tem uma variavel de instancia q utiliza de um wrapper...entao, assim como vc está deixando o C1 para o GC, vc tb está deixando a referencia do wrapper, SHORT

ok!?


Ué, e C3 não está null tbém?

Engraçado que eu colocaria a C(2) tbém de cara, mas por achar que C1 e C3 estão null.

André Barbosa
Para de encher o saco e vai doar sangue!
twitter
[Email] [WWW]
Deiverson
Debugger

Membro desde: 29/09/2004 10:50:28
Mensagens: 52
Offline

marcioa1 wrote:
pardal_nb wrote:o livro esta certo...

existem 2 objetos...

vc acertou q o C1 está sujeito ao coletor, SÓ QUE, dentro do seu objeto C1, vc tem uma variavel de instancia q utiliza de um wrapper...entao, assim como vc está deixando o C1 para o GC, vc tb está deixando a referencia do wrapper, SHORT

ok!?


????????

Qual o nome desta referência do wrapper ? O que é referÊncia do wapper ? Quem é o wapper ?

???
Márcio


hehehehe, tambem "viajei"

"Pouco me importa ser julgado por vocês ou por qualquer tribunal humano, de fato, nem eu julgo a mim mesmo." 1 Co 4:3
[WWW]
pardal_nb
Virtual Machine Man

Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline

Vamos lá...

C3 não é NULO.... C3 faz referecia a C2...reparem que o metodo retorno uma referencia para o objeto q eh passado, q neste caso é :



C2... Por isso C3 nao eh nulo, ok?!

Seguindo...

Wrapper é um empacotador de tipos primitivos...faz com q tipos primitivos (int, flot, double ...) se tornem OBJETOS(Float, Integer ...)...

Na linha 2:

Temos uma variável de instância, ou seja do objeto instanciado...qnd nós instanciamos C1 (CardBoard c1 = new CardBoard(); ) ele terá essa variável de instancia com ele...isto é, "story" É uma var. de instancia de C1...e variaveis de instancia estão sujeitas ao GC....ok?!

seguindo..

qnd nós atribuimos um valor NULL para C1, ou seja, qnd tiramos o "controle remoto", o ponteiro, para o objeto no HEAP, nós estamos deixando para trás tb o nosso objeto story...(story é um objeto, e nao um tipo primitivo, notem, Short....se fosse short, ai a resposta seria 1)

certo pessoal?!
dreamspeaker
GUJ Ranger
[Avatar]

Membro desde: 22/04/2003 10:09:58
Mensagens: 752
Localização: SP - Capitar
Offline

pardal_nb wrote:Vamos lá...

C3 não é NULO.... C3 faz referecia a C2...reparem que o metodo retorno uma referencia para o objeto q eh passado, q neste caso é :



C2... Por isso C3 nao eh nulo, ok?!




E como se explica isso?

André Barbosa
Para de encher o saco e vai doar sangue!
twitter
[Email] [WWW]
felipealbuquerque
JavaGuru
[Avatar]

Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline

pardal_nb wrote:
Vamos lá...

[...]

certo pessoal?!


Pardal, tente entender essa lógica:

1. CardBoard.story é uma variável de instância, isso é correto. Mas repare que a a pergunta refere-se à quantidade de objetos que são elegíveis para o GC;
2. CardBoard.story não é um objeto, é uma variável de referência, portanto, no caso, aponta para um objeto do tipo Short;
3. Duas variáveis de referência dos tipos abaixo sempre apontarão para o mesmo objeto (para economia de memória):
3.1 Byte
3.2 Boolean
3.3 Character (de \u0000 a \u007F)
3.4 Short e Integer (de -128 a 127)
4. Temos dois objetos CardBoard criados. Os dois têm variáveis story que apontam para o mesmo objeto Short com valor 5;
5. Quando o CardBoard referenciado por c1 for coletado, a variável desse objeto story perderá sua referência com o Short, mas a variável story do objeto CardBoard referenciado por c2 ainda não perdeu sua referência, portanto esse Short não é elegível para o GC!!!
6. Se o código fosse como o descrito abaixo, realmente seriam dois objetos elegíveis para o GC:


Felipe de Alencar Albuquerque
[MSN]
felipealbuquerque
JavaGuru
[Avatar]

Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline

dreamspeaker wrote:
pardal_nb wrote:Vamos lá...

C3 não é NULO.... C3 faz referecia a C2...reparem que o metodo retorno uma referencia para o objeto q eh passado, q neste caso é :



C2... Por isso C3 nao eh nulo, ok?!




E como se explica isso?


c3 é nulo! O método CardBoard.go(CardBoard) retorna uma variável de referência que não aponta para nada (nula)!
c2 não é nulo porque o que é passado para o método é uma cópia de como chegar ao objeto referenciado por ele, portanto o valor de c2 (como chegar no objeto) continua inalterado, independente do que acontecer no método! O método, todavia, pode modificar o objeto.

This message was edited 1 time. Last update was at 14/12/2007 11:19:08


Felipe de Alencar Albuquerque
[MSN]
pardal_nb
Virtual Machine Man

Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline

felipealbuquerque wrote:
2. CardBoard.story não é um objeto, é uma variável de referência, portanto, no caso, aponta para um objeto do tipo Short;
6. Se o código fosse como o descrito abaixo, realmente seriam dois objetos elegíveis para o GC:



entao me fala, quais?

se for como estão falando seriam os mesmos objetos

felipealbuquerque
JavaGuru
[Avatar]

Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline

pardal_nb wrote:
felipealbuquerque wrote:
2. CardBoard.story não é um objeto, é uma variável de referência, portanto, no caso, aponta para um objeto do tipo Short;
6. Se o código fosse como o descrito abaixo, realmente seriam dois objetos elegíveis para o GC:



entao me fala, quais?

se for como estão falando seriam os mesmos objetos



O CardBoard referenciado por c1 e o Short (de valor 1680) referenciado por c1.story.

Novamente: quando o Short está entre -128 e 127, duas variáveis de referência apontam para o mesmo objeto. Fora desse intervalo, vários objetos são criados.

Felipe de Alencar Albuquerque
[MSN]
pardal_nb
Virtual Machine Man

Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline

e o C3?!

ele continua a msm coisa, entao seriam 3 objetos, nao 2, certo?!

This message was edited 1 time. Last update was at 14/12/2007 13:43:18

felipealbuquerque
JavaGuru
[Avatar]

Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline

pardal_nb wrote:e o C3?!

ele continua a msm coisa, entao seriam 3 objetos, nao 2, certo?!


Em momento algum foi criado um objeto para c3 referenciar. Note que, desde sua inicialização, c3 == null.
Um erro que costumam-se cometer é confundir as variáveis de referência com os objetos em si (e isso é explorado no exame). Quando declaramos uma variável de referência, não necessariamente criamos um objeto junto.

Felipe de Alencar Albuquerque
[MSN]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team