Java HiddenFeatures<br />Traquitanas  escondidas ou simplesmente pouco usadas no Java<br />
Josenaldo de Oliveira Matos Filho<br />Analista de Sistema Everis<br />8 anos de experiência com Java e desenvolvimento<br...
São “features” pouco usadas do Java<br />Nenhuma feature é escondida, apenas obscura, desconhecida<br />Algumas delas são ...
Uma das formas mais estranhas de se criar um Map inicializado é através da Double BraceInitialization.<br />Ex: <br />Doub...
WTF?<br />Classes internas anônimas que herda de HashMap<br />Portanto, herda métodos como put()<br />Bloco de inicializaç...
Uma adição do Java 1.5 ainda pouco conhecida (ou percebida)<br />Um método sobrescrito pode retornar uma subclasse da clas...
Quer lançar uma NullPointerException?<br />Lançando NullPointerExcenption<br />publicvoidmandaNullNaCara() {<br />thrownul...
A instrução throw, ao ser processada, avalia a expressão à direita. <br />Se a expressão gera um Throwable, este é lançado...
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 />Brinc...
Quem for pego fazendo isso vai sofrer vudu reverso!<br />Um erro é para ser tratado ou lançado, nunca escondido!<br />Aten...
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.R...
Agora mais bizarro ainda!<br />publicclassThrowerSample {<br />publicstaticvoidmain( String[] args ) {<br />Thrower.spit(n...
Java não tem goto, mas...<br />LabeledBlocks<br />Quero ver isso funcionar!<br />// codigo<br />saifora:{<br />    for (in...
LabeledBlocks<br />publicstatic String getErrorMsg(String _data){    String _errMsg = “”; <br />    VALIDATION:    {      ...
Muita gente não sabe, mas enums podem:<br />Ter Métodos<br />Ter Atributos<br />Ter Construtores<br />Implementar interfac...
Enum<br />enumCaes{<br />  MINOTAURO(2), TITAN(3), SADAM(7);<br />privateint idade;<br />Caes(int idade) {<br />this.idade...
Enum<br />publicenum Salas implements Sala{<br />   PRIMEIRA{<br />public Sala norte() {<br />return SEGUNDA;<br />      }...
Desde a versão 1.5, o Java aceita parâmetros variáveis<br />Var args<br />publicvoidfoo(String... bars) {<br />   for (Str...
Printf e String.format<br />Printf do entrou na versão 1.5<br />String.format funciona analogamente, mas retorna ao invés ...
Divisão por 0<br />publicclass teste {publicstaticvoidmain(String[] args) {    try{      int x = 15;<br />int z = 0;      ...
Divisão por 0<br />publicclass teste {<br />publicstaticvoidmain(String[] args) {<br />try{<br />double x = 15;<br />doubl...
Quer ver um dump da hierarquia de componentes numa aplicação Swing?<br />Ctrl + Shift + F1<br />Resultado no console<br />...
Qual o resultado disso?<br />E isso?<br />Brincando com URLs<br />new URL("http://www.guj.com.br").equals(new URL("http://...
Como acessar os métodos e campos privados de fora dessa classe?<br />Arrebentando o encapsulamento<br />publicclassFoo {<b...
Arrebentando o encapsulamento<br />importjava.lang.reflect.*;<br />publicclass Arrebenta {<br />publicstaticvoidmain(Strin...
Arrebentando o encapsulamento<br />      System.out.println(foo);<br />      Field field=Foo.class.getDeclaredField("bar")...
Acesso esquisito<br />publicclassFoo {<br />staticintfubar = 42;<br />FoogetFoo() {<br />returnnull;    <br />    }<br />p...
É possível criar um programa sem Main!<br />Classe sem main!<br />publicclassWithoutMain {<br />static {<br />        Syst...
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 coman...
Todo arquivo .class começa com o valor hexadecimal 0xCAFEBABE, paraidentificá-lo como um arquivo de Bytecodeválido.<br />Q...
Classes anônimas<br />Você pode definir uma classe anônima e imediatamente chamar um método, mesmo que ela não implemente ...
Permite a criação de uma thread eu será chamada somente quando a JVM for encerrada<br />Global JVM Finalizer<br />Liberar ...
Shutdown Hooks<br />Runtime.getRuntime().addShutdownHook(<br />new Thread() {<br />publicvoidrun() {<br />endApp();<br /> ...
Perguntas<br />
Próximos SlideShares
Carregando em…5
×

Java hidden features

7.581 visualizações

Publicada em

Java possui uma série de features que muita gente não conhece. Algumas são bem esquisitas. Outras, nem tanto.

Nessa palestra, mostro algumas dessas features.

Em breve atualizo com os exemplos.

Publicada em: Tecnologia
0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
7.581
No SlideShare
0
A partir de incorporações
0
Número de incorporações
897
Ações
Compartilhamentos
0
Downloads
14
Comentários
0
Gostaram
2
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. Josenaldo de Oliveira Matos Filho<br />Analista de Sistema Everis<br />8 anos de experiência com Java e desenvolvimento<br />UaiJUGLeader<br />Apaixonado por programação e desenvolvimento de software<br />http://jnaldo.com<br />Quem sou eu? <br />
  3. 3. 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 />
  4. 4. 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 />
  5. 5. 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 />
  6. 6. 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 />
  7. 7. 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 />
  8. 8. 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 />
  9. 9. 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 />
  10. 10. 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 />
  11. 11. 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 />
  12. 12. 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 />
  13. 13. 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 />
  14. 14. 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 />
  15. 15. 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 />
  16. 16. Enum<br />enumCaes{<br /> MINOTAURO(2), TITAN(3), SADAM(7);<br />privateint idade;<br />Caes(int idade) {<br />this.idade = idade;<br /> }<br />publicintgetIdade() {<br />return idade;<br /> }<br />}<br />
  17. 17. Enum<br />publicenum Salas implements Sala{<br /> PRIMEIRA{<br />public Sala norte() {<br />return SEGUNDA;<br /> }<br /> },<br /> SEGUNDA{<br />public Sala sul() {<br />return PRIMEIRA;<br /> }<br /> }<br />public Sala 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 />
  18. 18. 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 />
  19. 19. 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 />double y = 33.75;<br />System.out.printf("x = %f y = %g", x, y);<br />double x = 27.5;<br />double y = 33.75;<br />String s = String.format("x = %f y = %g", x, y);<br />System.out.println(“String.format = “ + s);<br />
  20. 20. 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 />
  21. 21. Divisão por 0<br />publicclass teste {<br />publicstaticvoidmain(String[] args) {<br />try{<br />double x = 15;<br />double z = 0;<br />double y = 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 />
  22. 22. 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 />
  23. 23. 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 />
  24. 24. 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 />
  25. 25. Arrebentando o encapsulamento<br />importjava.lang.reflect.*;<br />publicclass Arrebenta {<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 />
  26. 26. 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 />
  27. 27. 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 />
  28. 28. É 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 />
  29. 29. 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 />
  30. 30. 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 />
  31. 31. 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 />
  32. 32. 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 />
  33. 33. Shutdown Hooks<br />Runtime.getRuntime().addShutdownHook(<br />new Thread() {<br />publicvoidrun() {<br />endApp();<br /> }<br />});;<br />
  34. 34. Perguntas<br />

×