Java hidden features

1.133 visualizações

Publicada em

0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.133
No SlideShare
0
A partir de incorporações
0
Número de incorporações
15
Ações
Compartilhamentos
0
Downloads
6
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Java hidden features

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

×