SlideShare uma empresa Scribd logo
1 de 34
Java HiddenFeatures Traquitanas  escondidas ou simplesmente pouco usadas no Java
Josenaldo de Oliveira Matos Filho Analista de Sistema Everis 8 anos de experiência com Java e desenvolvimento UaiJUGLeader Apaixonado por programação e desenvolvimento de software http://jnaldo.com Quem sou eu?
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
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
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
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() {         ...     } }
Quer lançar uma NullPointerException? Lançando NullPointerExcenption publicvoidmandaNullNaCara() { thrownull; } Como assim? O compilador pirou? Tá cobrando propina pra deixar isso passar?
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/
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;     }   }
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
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);   } }
Agora mais bizarro ainda! publicclassThrowerSample { publicstaticvoidmain( String[] args ) { Thrower.spit(newRemoteException("gounchecked!"));     } } Mim não gostar de lançar exceção assim!
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;             }         }     } }
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?
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
Enum enumCaes{   MINOTAURO(2), TITAN(3), SADAM(7); privateint idade; Caes(int idade) { this.idade = idade;   } publicintgetIdade() { return idade;   } }
Enum publicenum Salas implements Sala{    PRIMEIRA{ public Sala norte() { return SEGUNDA;       }    },    SEGUNDA{ public Sala sul() { return PRIMEIRA;       }    } public Sala 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(); }
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") }
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; double y = 33.75; System.out.printf("x = %f y = %g", x, y); double x = 27.5; double y = 33.75; String s = String.format("x = %f y = %g", x, y); System.out.println(“String.format = “ + s);
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
Divisão por 0 publicclass teste { publicstaticvoidmain(String[] args) { try{ double x = 15; double z = 0; double y = x / z;       System.out.println(“A divisão é “ + x);     }catch(ArithmeticException a){       System.out.println(“Erro!! Divisão por zero!!!”);     }   } } WTF???????
Quer ver um dump da hierarquia de componentes numa aplicação Swing? Ctrl + Shift + F1 Resultado no console Boa ferramenta para depuração!  Swing
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; }
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+"]";   } }
Arrebentando o encapsulamento importjava.lang.reflect.*; publicclass Arrebenta { publicstaticvoidmain(String[] args) throwsNoSuchMethodException,IllegalAccessException,   InvocationTargetException, NoSuchFieldException { Foofoo=newFoo();       System.out.println(foo); Methodmethod=Foo.class.getDeclaredMethod         ("setBar", int.class); method.setAccessible(true); method.invoke(foo, 42);
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!
Acesso esquisito publicclassFoo { staticintfubar = 42; FoogetFoo() { returnnull;         } publicstaticvoidmain(String args[]) { Foofoo = newFoo();         System.out.println(foo.getFoo().fubar);     } } // saida:  42 Agora você tá de sacanagem!
É 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!!
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/
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
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");
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
Shutdown Hooks Runtime.getRuntime().addShutdownHook( new Thread() { publicvoidrun() { endApp();     } });;
Perguntas

Mais conteúdo relacionado

Mais procurados

Programação Concorrente - Aula 05
Programação Concorrente - Aula 05Programação Concorrente - Aula 05
Programação Concorrente - Aula 05thomasdacosta
 
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exceptionLoiane Groner
 
Tratamento de exceções java
Tratamento de exceções   javaTratamento de exceções   java
Tratamento de exceções javaAntonio Oliveira
 
UnP Eng. Software - Aula 28
UnP Eng. Software - Aula 28UnP Eng. Software - Aula 28
UnP Eng. Software - Aula 28Hélio Medeiros
 
[Curso Java Basico - Exceptions] Aula 48: multiplos catch
[Curso Java Basico - Exceptions] Aula 48: multiplos catch[Curso Java Basico - Exceptions] Aula 48: multiplos catch
[Curso Java Basico - Exceptions] Aula 48: multiplos catchLoiane Groner
 
Introdução a programação I
Introdução a programação IIntrodução a programação I
Introdução a programação IClerton Leal
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Tchelinux
 
[MTC 2021] Conversa sobre shift left - Douglas Cardoso
[MTC 2021] Conversa sobre shift left - Douglas Cardoso[MTC 2021] Conversa sobre shift left - Douglas Cardoso
[MTC 2021] Conversa sobre shift left - Douglas Cardosominastestingconference
 
Programação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaProgramação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaElaine Cecília Gatto
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - FlisolLeonn Leite
 
Desligar pc
Desligar pcDesligar pc
Desligar pcferbsi
 

Mais procurados (20)

Programação Concorrente - Aula 05
Programação Concorrente - Aula 05Programação Concorrente - Aula 05
Programação Concorrente - Aula 05
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
 
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
 
Java 13 Excecoes
Java 13 ExcecoesJava 13 Excecoes
Java 13 Excecoes
 
Tratamento de exceções java
Tratamento de exceções   javaTratamento de exceções   java
Tratamento de exceções java
 
Código Limpo
Código LimpoCódigo Limpo
Código Limpo
 
Java14
Java14Java14
Java14
 
Threads e Estruturas de dados
Threads e Estruturas de dadosThreads e Estruturas de dados
Threads e Estruturas de dados
 
UnP Eng. Software - Aula 28
UnP Eng. Software - Aula 28UnP Eng. Software - Aula 28
UnP Eng. Software - Aula 28
 
[Curso Java Basico - Exceptions] Aula 48: multiplos catch
[Curso Java Basico - Exceptions] Aula 48: multiplos catch[Curso Java Basico - Exceptions] Aula 48: multiplos catch
[Curso Java Basico - Exceptions] Aula 48: multiplos catch
 
Tratamento de exceções em Java
Tratamento de exceções em JavaTratamento de exceções em Java
Tratamento de exceções em Java
 
Introdução a programação I
Introdução a programação IIntrodução a programação I
Introdução a programação I
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
 
[MTC 2021] Conversa sobre shift left - Douglas Cardoso
[MTC 2021] Conversa sobre shift left - Douglas Cardoso[MTC 2021] Conversa sobre shift left - Douglas Cardoso
[MTC 2021] Conversa sobre shift left - Douglas Cardoso
 
JavaScript das Ruas
JavaScript das RuasJavaScript das Ruas
JavaScript das Ruas
 
Programação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaProgramação Desktop: Revisão Core Java
Programação Desktop: Revisão Core Java
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
 
Javascript
JavascriptJavascript
Javascript
 
Desligar pc
Desligar pcDesligar pc
Desligar pc
 
POO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em JavaPOO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em Java
 

Semelhante a Java hidden features

Linguagens de Programação II - Aula 3
Linguagens de Programação II - Aula 3Linguagens de Programação II - Aula 3
Linguagens de Programação II - Aula 3guestd6da1cd
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.pptEmerson Cardoso
 
Estrutura de linguagem C++
Estrutura de linguagem C++Estrutura de linguagem C++
Estrutura de linguagem C++Verônica Veiga
 
Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?Arthur Xavier
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionaliMasters
 
Aop Aspect J 1.5.4 Capitulo 04
Aop Aspect J 1.5.4 Capitulo 04Aop Aspect J 1.5.4 Capitulo 04
Aop Aspect J 1.5.4 Capitulo 04Diego Pacheco
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010rafaelferreira
 
Groovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessGroovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessRafael Farias Silva
 

Semelhante a Java hidden features (20)

Java3
Java3Java3
Java3
 
Linguagens de Programação II - Aula 3
Linguagens de Programação II - Aula 3Linguagens de Programação II - Aula 3
Linguagens de Programação II - Aula 3
 
Java script aula 02 - operadores
Java script   aula 02 - operadoresJava script   aula 02 - operadores
Java script aula 02 - operadores
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.ppt
 
Tutorial java swing
Tutorial java swingTutorial java swing
Tutorial java swing
 
Estrutura de linguagem C++
Estrutura de linguagem C++Estrutura de linguagem C++
Estrutura de linguagem C++
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
Aula3
Aula3Aula3
Aula3
 
Tdc2010 web
Tdc2010 webTdc2010 web
Tdc2010 web
 
Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
 
Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?
 
Artigoajax
ArtigoajaxArtigoajax
Artigoajax
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
 
Aula5
Aula5Aula5
Aula5
 
Aop Aspect J 1.5.4 Capitulo 04
Aop Aspect J 1.5.4 Capitulo 04Aop Aspect J 1.5.4 Capitulo 04
Aop Aspect J 1.5.4 Capitulo 04
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
 
Groovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessGroovy para javeiros - Migração Painless
Groovy para javeiros - Migração Painless
 
ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09
 

Mais de Josenaldo de Oliveira Matos Filho (7)

De Padawan a Jedi - A Saga do Desenvolvedor Java
De Padawan a Jedi - A Saga do Desenvolvedor JavaDe Padawan a Jedi - A Saga do Desenvolvedor Java
De Padawan a Jedi - A Saga do Desenvolvedor Java
 
Coding Dojo em 10 Minutos!
Coding Dojo em 10 Minutos!Coding Dojo em 10 Minutos!
Coding Dojo em 10 Minutos!
 
O Spring está morto! Viva o Spring!
O Spring está morto! Viva o Spring!O Spring está morto! Viva o Spring!
O Spring está morto! Viva o Spring!
 
Programação Orientada a Gambiarra
Programação Orientada a GambiarraProgramação Orientada a Gambiarra
Programação Orientada a Gambiarra
 
Java virtual machine quantas linguas fala a jvm2
Java virtual machine   quantas linguas fala a jvm2Java virtual machine   quantas linguas fala a jvm2
Java virtual machine quantas linguas fala a jvm2
 
Josenaldo a jornada do empreendedor - a aventura da JNaldo
Josenaldo a jornada do empreendedor - a aventura da JNaldoJosenaldo a jornada do empreendedor - a aventura da JNaldo
Josenaldo a jornada do empreendedor - a aventura da JNaldo
 
A saga do desenvolvedor java
A saga do desenvolvedor javaA saga do desenvolvedor java
A saga do desenvolvedor java
 

Java hidden features

  • 1. Java HiddenFeatures Traquitanas escondidas ou simplesmente pouco usadas no Java
  • 2. Josenaldo de Oliveira Matos Filho Analista de Sistema Everis 8 anos de experiência com Java e desenvolvimento UaiJUGLeader Apaixonado por programação e desenvolvimento de software http://jnaldo.com Quem sou eu?
  • 3. 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
  • 4. 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
  • 5. 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
  • 6. 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() { ... } }
  • 7. Quer lançar uma NullPointerException? Lançando NullPointerExcenption publicvoidmandaNullNaCara() { thrownull; } Como assim? O compilador pirou? Tá cobrando propina pra deixar isso passar?
  • 8. 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/
  • 9. 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; } }
  • 10. 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
  • 11. 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); } }
  • 12. Agora mais bizarro ainda! publicclassThrowerSample { publicstaticvoidmain( String[] args ) { Thrower.spit(newRemoteException("gounchecked!")); } } Mim não gostar de lançar exceção assim!
  • 13. 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; } } } }
  • 14. 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?
  • 15. 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 enumCaes{ MINOTAURO(2), TITAN(3), SADAM(7); privateint idade; Caes(int idade) { this.idade = idade; } publicintgetIdade() { return idade; } }
  • 17. Enum publicenum Salas implements Sala{ PRIMEIRA{ public Sala norte() { return SEGUNDA; } }, SEGUNDA{ public Sala sul() { return PRIMEIRA; } } public Sala 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(); }
  • 18. 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") }
  • 19. 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; double y = 33.75; System.out.printf("x = %f y = %g", x, y); double x = 27.5; double y = 33.75; String s = String.format("x = %f y = %g", x, y); System.out.println(“String.format = “ + s);
  • 20. 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
  • 21. Divisão por 0 publicclass teste { publicstaticvoidmain(String[] args) { try{ double x = 15; double z = 0; double y = x / z; System.out.println(“A divisão é “ + x); }catch(ArithmeticException a){ System.out.println(“Erro!! Divisão por zero!!!”); } } } WTF???????
  • 22. Quer ver um dump da hierarquia de componentes numa aplicação Swing? Ctrl + Shift + F1 Resultado no console Boa ferramenta para depuração! Swing
  • 23. 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; }
  • 24. 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 importjava.lang.reflect.*; publicclass Arrebenta { publicstaticvoidmain(String[] args) throwsNoSuchMethodException,IllegalAccessException, InvocationTargetException, NoSuchFieldException { Foofoo=newFoo(); System.out.println(foo); Methodmethod=Foo.class.getDeclaredMethod ("setBar", int.class); method.setAccessible(true); method.invoke(foo, 42);
  • 26. 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. Acesso esquisito publicclassFoo { staticintfubar = 42; FoogetFoo() { returnnull; } publicstaticvoidmain(String args[]) { Foofoo = newFoo(); System.out.println(foo.getFoo().fubar); } } // saida: 42 Agora você tá de sacanagem!
  • 28. É 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!!
  • 29. 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/
  • 30. 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
  • 31. 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");
  • 32. 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
  • 33. Shutdown Hooks Runtime.getRuntime().addShutdownHook( new Thread() { publicvoidrun() { endApp(); } });;