O documento descreve recursos pouco conhecidos da linguagem Java, incluindo inicialização de mapas usando Double BraceInitialization, lançar exceções de métodos sem declaração e acessar membros privados usando reflexão.
2. São “features” pouco usadas do Java Nenhuma featureé escondida, apenas obscura, desconhecida Algumas delas são bem esquisitas Muitas consideradas até mesmo impossíveis Use com cautela Em alguns casos, são facilidades Porém, em outros, deixam as coisas mais complicadas. Podem piorar, por exemplo, a legibilidade O que são HiddenFeatures
3. Uma das formas mais estranhas de se criar um Map inicializado é através da Double BraceInitialization. Ex: Double BraceInitialization Mapmap = newHashMap() {{ put("a key", "a value"); put("anotherkey", "anothervalue"); }}; Veja mais: http://www.c2.com/cgi/wiki?DoubleBraceInitialization
4. WTF? Classes internas anônimas que herda de HashMap Portanto, herda métodos como put() Bloco de inicialização Chamado logo após a chamada a super() Em um construtor sem o “super”, passa a impressão de eu é chamado antes do construtor Pode ser usado para agrupar lógica usada por vários construtores É legal, mas evite! Double BraceInitialization
5. Uma adição do Java 1.5 ainda pouco conhecida (ou percebida) Um método sobrescrito pode retornar uma subclasse da classe retornada pelo método da superclasse (ou interface) Necessário para o funcionamento de generics CovariantReturn class Super { Collection<String> values() { ... } } classSubClassextends Super { @Override List<String> values() { ... } }
6. Quer lançar uma NullPointerException? Lançando NullPointerExcenption publicvoidmandaNullNaCara() { thrownull; } Como assim? O compilador pirou? Tá cobrando propina pra deixar isso passar?
7. A instrução throw, ao ser processada, avalia a expressão à direita. Se a expressão gera um Throwable, este é lançado Ex: throwgetException() Se a expressão completa normalmente, produzindo um valor não nulo, retorna esse valor Ex: thrownewSograEmCasaException() Se a expressão resulta em null, o null é convertido para NullpointerException! Lançando NullPointerExcenption Veja mais: http://www.adarshr.com/papers/npe http://java.sun.com/docs/books/jls/
8. Quer tirar uma exceção lançada de campo? Faz o return no finally! O código abaixo não lança a exceção Brincando com finally public static void fazAlgumaCoisa() { try { //Fazalgumacoisa… throw new RuntimeException(); } finally { return; } }
9. Quem for pego fazendo isso vai sofrer vudu reverso! Um erro é para ser tratado ou lançado, nunca escondido! Atenção Veja Mais: http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
10. Como lançar uma exceção CHECADA de um método que não declara exceção! Agora mais bizarro ainda! importjava.rmi.RemoteException; classThrower { publicstaticvoidspit(final Throwable exception) { classEvilThrower<T extendsThrowable> { @SuppressWarnings("unchecked") privatevoidsneakyThrow(Throwable exception) throws T { throw (T) exception; } } newEvilThrower<RuntimeException>().sneakyThrow(exception); } }
11. Agora mais bizarro ainda! publicclassThrowerSample { publicstaticvoidmain( String[] args ) { Thrower.spit(newRemoteException("gounchecked!")); } } Mim não gostar de lançar exceção assim!
12. Java não tem goto, mas... LabeledBlocks Quero ver isso funcionar! // codigo saifora:{ for (int i = 0; i < N; ++i) { for (int j = i; j < N; ++j) { for (int k = j; k < N; ++k) { //mais código pog breaksaifora; } } } }
13. LabeledBlocks publicstatic String getErrorMsg(String _data){ String _errMsg = “”; VALIDATION: { if (_data.length() > 10) { _errMsg = “ERR: Data lengthexceed 10 chars”; break VALIDATION; } // Resto docódigo de validação } // Tratamento da mensagem de erro if (_errMsg.length() != 0) { _errMsg += “Pleasefixtheerror.”; } return _errMsg;} Problem?
14. Muita gente não sabe, mas enums podem: Ter Métodos Ter Atributos Ter Construtores Implementar interfaces Enum Veja mais: http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html
16. Enum publicenumSalas implements Sala{ PRIMEIRA{ publicSala norte() { returnSEGUNDA; } }, SEGUNDA{ publicSala sul() { returnPRIMEIRA; } } publicSala norte() { returnnull; } public Sala sul() { returnnull; } public Sala lest() { returnnull; } public Sala oeste() { returnnull; } } public interface Sala{ public Sala norte(); public Sala sul(); public Sala leste(); public Sala oeste(); }
17. Desde a versão 1.5, o Java aceita parâmetros variáveis Var args publicvoidfoo(String... bars) { for (String bar: bars) System.out.println(bar); } publicvoidtest() { foo("first","second","third") }
18. Printf e String.format Printf do entrou na versão 1.5 String.format funciona analogamente, mas retorna ao invés de imprimir double x = 27.5; doubley = 33.75; System.out.printf("x = %f y = %g", x, y); double x = 27.5; doubley = 33.75; String s = String.format("x = %f y = %g", x, y); System.out.println(“String.format = “ + s);
19. Divisão por 0 publicclass teste {publicstaticvoidmain(String[] args) { try{ int x = 15; int z = 0; double y = x / z; System.out.println(“A divisão é “ + y); }catch(ArithmeticException a){ System.out.println(“Erro!! Divisão por zero!!!”); } }} Ok. Isto lança uma ArithmeticException
20. Divisão por 0 publicclass teste { publicstaticvoidmain(String[] args) { try{ doublex = 15; double z = 0; doubley = x / z; System.out.println(“A divisão é “ + x); }catch(ArithmeticException a){ System.out.println(“Erro!! Divisão por zero!!!”); } } } WTF???????
21. Quer ver um dump da hierarquia de componentes numa aplicação Swing? Ctrl + Shift + F1 Resultado no console Boa ferramenta para depuração! Swing
22. Qual o resultado disso? E isso? Brincando com URLs new URL("http://www.guj.com.br").equals(new URL("http://208.109.100.149") ) public intumMetodo(){ System.out.println(“Acessando o Google:”); http://www.google.com return 1; }
23. Como acessar os métodos e campos privados de fora dessa classe? Arrebentando o encapsulamento publicclassFoo { privateint bar; publicFoo() { setBar(17); } privatevoidsetBar(int bar) { this.bar=bar; } publicintgetBar() { return bar; } public String toString() { return "Foo[bar="+bar+"]"; } }
25. Arrebentando o encapsulamento System.out.println(foo); Field field=Foo.class.getDeclaredField("bar"); field.setAccessible(true); field.set(foo, 23); System.out.println(foo); } } Isso vai dar merda!
27. É possível criar um programa sem Main! Classe sem main! publicclassWithoutMain { static { System.out.println("Lookman, no main!!"); System.exit(0); } } $ javaWithoutMain Lookman, no main!!
28. Distribuída com o JDK a partir da versão1.6_07 Profiler leve Integra uma série de ferramentas de linha de comando VisualVM Veja mais: http://visualvm.java.net/
29. Todo arquivo .class começa com o valor hexadecimal 0xCAFEBABE, paraidentificá-lo como um arquivo de Bytecodeválido. Querexibiruma Splash screen? Bastarodar o programa com o parâmetro de máriona virtual splash:caminho Curiosidades java -splash:imagem.jpeg -jar Reverso.jar
30. Classes anônimas Você pode definir uma classe anônima e imediatamente chamar um método, mesmo que ela não implemente nenhuma interface newObject() { voidfoo(String s) { System.out.println(s); } }.foo("Hello");
31. Permite a criação de uma thread eu será chamada somente quando a JVM for encerrada Global JVM Finalizer Liberar recursos Matar programas Funciona com System.exit(), ou com CTRL-C / kill -15 Obviamente, nãofunciona com kill -9, em *nix Shutdown Hooks