JavaOne/2005 - pegadinha Java para os feras

Olá

Alguém sabe dizer qual valor de i torna o loop abaixo um loop infinito?

while (i == -i && i != 0) { }

Tentem, tentem de novo, 10 minutos para os feras, 3 minutos para o thingol!

Os demais vejam: Code Talk with Joshua Bloch and Neal Gafter

[]s
Luca

Legal, Luca :smiley:

Gostei desse.

-Sami

eu fiz aki… se bem que eu acho que o meu método está ilícito… :twisted:

mas matmaticamente tem que haver algo de ilícito neste problema…

:wink:

[editado] fui ver a solução e realmente meu método estava ilícito… que cosia bizarra, não tinha reparado naquilo… [/editado]

Cara, um daqueles me assustou.

olha isso:

Eu fiz este teste e a saída foi:

the chemistry set

Porque???

http://java.sun.com/javaone/sf/CodeTalk2.jsp

Ps.: 1.4.2

:XD: Nossa fera mesmo!!!

Interessante mesmo, isso.

Brincando com isso por um tempo observei o seguinte:

Se a classe Words for definido assim:

public class Words {
    public static final String FIRST = "the";
    public static final String SECOND = null;
    public static final String THIRD = "set";
 }

O compilador cria o seguinte código(bytecode, a saída de “javap -c”) para o método main da classe PrintWords:

Assim, com uma referência para Words.SECOND o código fica “lendo” o valor no tempo de execução. A diferença entre os versões sendo que o 1.5 usa a classe StringBuilder que não é sincronizado e assim é mais rápido.

E isso é a resposta para sua pergunta. Porque pega o valor do Words.SECOND cada vez da classe Words, e assim, qualquer mudança no valor será refletido na execução da classe PrintWords. Mas faz optimização com FIRST e THIRD e pega os valores no tempo da compilação, copiando os valores dos Strings na classe PrintWords.

Ok… mas… se a classe Words for definido na forma seguinte:

public class Words {
    public static final String FIRST = "the";
    public static final String SECOND = "chemistry";
    public static final String THIRD = "set";
 }

O bytecode criado para a outra classe… a classe PrintWriter vai ser o sequinte:

O compilador fazendo optimização criando o String completa e não colocando referências para a classe Words. Assim, uma mudança na classe Words não será automaticamente refletido na classe PrintWords - só quando a classe PrintWords também está compilado.

Então… o compilador não está optimizando o String com uma referência null.

Receio que com meu português o assunto fica ainda mais confuso… mas é um risco que a gente tem que correr. :slight_smile:

-Sami

Por que ele não faz inline do null??? Aff, esse ano eles tão apelando MUITO.

Tou ainda mais intrigado, por que ele não funciona com null? Lendo a JLS

http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#39990

da a impressâo que isso não faz o menos sentido.

[quote=Sami Koivu]
Receio que com meu português o assunto fica ainda mais confuso… mas é um risco que a gente tem que correr. :slight_smile:

-Sami [/quote]

Com o seu português a coisa fica mais fácil de entender… não é todo brasileiro que escreve bem assim…

Cara, muito louco isso… legal :slight_smile:

Obrigado Felipe. :smiley:

E Louds… também não entendo o porque.

-Sami