Hidden Features of Java

4 respostas
Marky.Vasconcelos

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?

4 Respostas

davidbuzatto

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:

class Lists {
  public static <T> List<T> toList(T... arr) {
    List<T> list = new ArrayList<T>();
    for (T elt : arr) 
        list.add(elt);
    return list;
  }
}

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

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

// veja a saida do compilador para isso
List<Integer> ints3 = Lists.toList(1, 2, 3, "");

// e para isso :D
List<Integer> ints4 = Lists.<Integer>toList(1, 2, 3, "");
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

A

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.

Paulo_Silveira

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.

Marky.Vasconcelos

É… 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{
//
}
Criado 28 de janeiro de 2011
Ultima resposta 31 de jan. de 2011
Respostas 4
Participantes 4