Quanto � funcionalidade eu n�o sei, mas em
rela��o ao resultado obtido n�o seria de espantar um programador java
certificado, visto que isso � uma quest�o de certifica��o (mesmo assim � bom
ressaltar que � um detalhe muito capicioso). Eu mesmo aprendi isso enquanto
estudava para a minha h� algum tempo atr�s, mas concordo contigo que quando a
gente aprende isso fica meio surpreso mesmo.
----- Original Message -----
From: "Rutenio Sampaio" <[EMAIL PROTECTED]>
To: "Lista CEJUG" <[email protected]>
Sent: Wednesday, February 09, 2005 8:54
AM
Subject: [cejug-discussao] a += b � o
mesmo que a = a + b... Certo? Errado!
"Eu percebi isto enquanto debugava um c�digo...
Uma das funcionalidades de Java projetadas para tornar nossa vida mais
f�cil ao degugar s�o os catchs de atribui��o do compilador que
resultaria em perda de precis�o, nos dizendo que devemos realizar um
cast expl�cito, certo? Por exemplo, aqui temos um exemplo de c�digo:
int a = 5;
float b = 7.5;
a = a + b; // Erro de compila��o. Cast expl�cito � necess�rio por
causa de uma poss�vel perda de precis�o.
O compilador n�o deixar� passar, pois resulta em perda de precis�o.
Nenhuma surpresa aqui. Precisamos fazer um cast expl�cito se quisermos
adicionar b a a.
Mas vamos modificar um pouco o c�digo:
int a = 5;
float b = 7.5;
a += b;
O c�digo compilar� bem sem ao menos uma advert�ncia sobre a perda de
precis�o que ir� acontecer. A princ�pio pensei ter descoberto um bug
no javac. Encontrei outro programador Java que achava realmente que
fosse um bug. Ent�o fiz uma busca no banco de bugs, assim como na
especifica��o da linguagem, e acabei encontrando isto:
A compound assignment _expression_ of the form E1 op= E2 is equivalent
to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1
is evaluated only once. Note that the implied cast to type T may be
either an identity conversion (�5.1.1) or a narrowing primitive
conversion (�5.1.3). For example, the following code is correct:
short x = 3;
x += 4.6;
and results in x having the value 7 because it is equivalent to:
short x = 3;
x = (short)(x + 4.6);
Interessante... Isto significa que meu "bug" n�o � um bug na
realidade, na verdade � um "funcionalidade".
Isto foi uma grande surpresa dado que v�rios tutoriais (incluindo o
pr�prio Java tutorial da Sun) ensina que a += b � equivalente a a = a
+ b. Por�m podemos ver que n�o s�o realmente equivalentes. A
atribui��o composta ir� silenciosamente realizar um cast impl�cito o
que resultar� em perda de precis�o sem ao menos uma advert�ncia do
compilador. � muito f�cil introduzir bugs s�bitos no seu programa por
causa dessa funcionalidade. Especialmente por ir contra o que
esperar�amos de um comportamento normal do javac dado o grande n�mero
de situa��es de perda de precis�o. O que diabos a Sun estava pensando
quando adicionou essa funcionalidade?"
-------------------------------------------------------------------------------------------
Ceara' Java User Group
Para cancelar sua assinatura, envie um e-mail para: [EMAIL PROTECTED]
Para mais informacoes, mande um e-mail para: [EMAIL PROTECTED]
Falar com o administrador? e-mail para: [EMAIL PROTECTED]
