Instanciar Objeto

6 respostas
71C4700

Tenho uma duvida na hora de setar o valor de um campo de um POJO.

class Pessoa{
@Id @GeneretedValue
private int id;
// mais atributos

}

Quando instanciamos um objeto o valor default de um atriuto int é 0, corretor?

Então com o Hibernate sabe a diferença entre.

Pessoa pessoa = new Pessoa("Alguem",0);

de

Pessoa pessoa = new Pessoa();

A duvida surgiu quando temos que setar o valor deste campo,pois faço isto em tempo de execução, ai nao tenho como saber se o campo ta zerado por conta que seu valor é zero ou por que nao foi atribuido algum valor a ele ainda.

Alguma sugentão?

6 Respostas

jvlouvem

é realmente não há diferença entre um int vazio e um int com o valor zero…

Voce poderia trocar este atributo para Integer ? Se puder ele irá vir como default null, logo null é diferente de zero.

71C4700

Com relação a isso já resolvi meu problema, coloquei todos os tipos de atributos antes primitivos com seus Wagetes.

Mas é que continuo querendo saber como ele diferencia, pois se o codigo for zero, inicialmente, ele tentaria setar e daria erro, mas mesmo assim não o dá.

Fiquei curioso pra saber, e acontece o mesmo com os valores booleanos e os demais valores numericos float,long,double, tem alguma forma de saber se determinando campo já foi ou nao setado?

Fica a duvida ainda…

T

Quando o Java cria um objeto, ele simplesmente reserva um “slot” (4 ou 8 bytes) para cada variável de instância, e o preenche com zeros binários.
Aí sim é que o código do construtor é chamado. Esse código então pode inicializar as variáveis de instância com outros valores, se quiser.

Casualmente, zeros binários são entendidos como 0 (no caso de um int ou long ou char ou short ou double ou float), ou null (no caso de um tipo objeto.)

Então não dá pra saber se o campo não foi setado ou se foi preenchido, depois da criação e inicialização do objeto, com zero. Não há um valor “UNINITIALIZED” em binário que seja diferente de todos os outros.

(Entretanto, o Java pode determinar em tempo de compilação se você está tentando usar uma variável local não-inicializada, mas isso é porque ele faz análise de fluxo do seu programa. Se ninguém atribui um valor a uma variável X e você tentar ler o valor dessa variável local, a análise de fluxo vai dizer que o valor não tem como ter sido inicializado e vai ser mostrado um erro de compilação.)

71C4700

Eu imagina isso mais nao de uma forma tao teorica, mas e como o hibernate consegue diferencia isso?

E todos os valores padrão (Slots) citados a cima podem ser definidos e configurados de uma outra forma?

Imagine que tenho um objeto e tenho um campo int, tenho que recuperar seu valor,se nao atribuir valor algum ele retorna zero, e como vou diferenciar isso de um real valor zero?

Esta seia algo que a plataforma Java poderia rever?

T

Se não me engano, o Hibernate usa alguns truques para determinar se você alterou um campo de um objeto.
Um deles é que você na verdade não trabalha diretamente com a tal classe que representa uma entidade, e sim com uma outra classe que o Hibernate cria em tempo de execução e que contém código criado para interceptar os acessos aos campos, ou pelo menos para fazer um “checksum” e determinar se os campos foram alterados.
Eu precisava que alguém me confirmasse isso, porque não tenho absoluta certeza disso (e teria de procurar nem sei onde no site do Hibernate).

71C4700

Gostei, eu poderia criar uma especie e Classe ou objeto temporario e setando os valores neste objeto e por fim eu o atribuia ao real objeto que deve ser instanciado …

Ou poderia tambem capturar os valores que serão setados e criar uma especie de validador pra estes campos…

Alguma sugestão?

Criado 19 de fevereiro de 2009
Ultima resposta 19 de fev. de 2009
Respostas 6
Participantes 3