Hidden Features of Java

Depois de ler isso no StackOverflow fiquei surpreso com algumas coisas.

Mas a quem mais me surpreendeu (não li todas) foi apertar Ctrl + Shift + F1 em algum programa Swing, depois da uma olhada no Console.

Se você fizer simplesmente throw null de dentro de um código é compilado e lançado um NullPointer quando executado naquele ponto.

O seguinte código que não é bem uma hidden feature mas é bem util pra quem não sabe

Map map = new HashMap() {{
    put("a key", "a value");
    put("another key", "another value");
}};

O que acontece é que voce esta criando uma class que extende HashMap e criando um bloco de codigo que vai ser executado nele.

È possivel juntar tipos no Generics

public class Baz<T extends Foo & Bar> {}

Dai só vai aceitar um parametro que seja Foo e Bar ao mesmo tempo.

Tem essa classe http://www.docjar.com/html/api/ClassLib/Common/sun/misc/Unsafe.java.html com ela

Mas o uso incorreto dessa classe pode matar a JVM.

new URL("http://www.yahoo.com").equals(new URL("http://209.191.93.52"))

Isso retorna true.

Alguém sabe mais alguma?

Sinceramente, não vi utilidade alguma no exemplo do mapa.
Vc gasta a mesma quantidade de linhas caso fosse fazer da forma tradicional, define mais uma classe sem haver necessidade, além de tornar o código difícil de ler.
Tah, se for usar como parâmetro para um método pode até ser útil.

Os genéricos tem muitas coisas que a gente não aprende normalmente. Dá uma olhadinha no livro “Java Generics and Collections”.

Olhe um exemplo tirado do livro citado:

[code]class Lists {
public static List toList(T… arr) {
List list = new ArrayList();
for (T elt : arr)
list.add(elt);
return list;
}
}

// inferência do tipo
List ints1 = Lists.toList(1, 2, 3);

// tipo definido explicitamente
List ints2 = Lists.toList(1, 2, 3);

// veja a saida do compilador para isso
List ints3 = Lists.toList(1, 2, 3, “”);

// e para isso :smiley:
List ints4 = Lists.toList(1, 2, 3, “”);[/code]

Tem certeza que seu exemplo de URL retorna true?
Esse exemplo aqui retorna true:

new URL("http://www.guj.com.br").equals(new URL("http://208.109.100.149") )

Afinal, 208.109.100.149 é o IP apontado pelo endereço www.guj.com.br.

[]'s

Acho que o exemplo do mapa pode ser interessante se for um mapa estático para a classe:

  private final static Map estadosPorRegiao = new HashMap() {{
     put("sudeste", "São Paulo", "Rio de Janeiro");  
     put("sul", "Santa Catarina", "Rio Grande do Sul");  
  }};  

Para adicionar, esse link aqui tem uma série de dicas interessantes.

o ruim do Unsafe é ser so Sun tambem. O pessoal do XStream e do Objenesis encapsulam isso para voce poder fazer essas magicas em qualquer JVM.

O do mapa é comum encontrar em codigo por ai.

E o da URL é um classico aviso, pra gente tomar cuidado com a velocidade de URLs dentro de Sets e como chaves em Maps, ou contains em qualquer collection.

nao conhecia o truque do swing.

É… pra falar a verdade esses são só exemplos incomuns.

Mas o do Swing realmente me chamou a atenção.

Alias, eu descobri algo hoje sem querer.
Pode-se adicionar qualquer modificador antes de package que funciona.

Isso compila:

private protected public final static private protected package com.view.popup;

public class MyClass{
//
}