java hidden features
DESCRIPTION
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.TRANSCRIPT
![Page 1: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/1.jpg)
Java Hidden Features
Traquitanas escondidas ou simplesmente pouco usadas no Java
![Page 2: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/2.jpg)
Josenaldo de Oliveira Matos Filho◦ Analista de Sistema Everis◦ 8 anos de experiência com Java e
desenvolvimento◦ UaiJUG Leader◦ Apaixonado por programação e desenvolvimento
de software◦ http://jnaldo.com
Quem sou eu?
![Page 3: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/3.jpg)
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 Hidden Features
![Page 4: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/4.jpg)
Uma das formas mais estranhas de se criar um Map inicializado é através da Double Brace Initialization.
Ex:
Double Brace Initialization
Map map = new HashMap() {{ put("a key", "a value"); put("another key", "another value"); }};
Veja mais: http://www.c2.com/cgi/wiki?DoubleBraceInitialization
![Page 5: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/5.jpg)
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 Brace Initialization
![Page 6: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/6.jpg)
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
Covariant Return
class Super { Collection<String> values() { ... }}
class SubClass extends Super { @Override List<String> values() { ... }}
![Page 7: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/7.jpg)
Quer lançar uma NullPointerException?
Lançando NullPointerExcenption
public void mandaNullNaCara() {throw null;
}
Como assim? O compilador pirou? Tá cobrando
propina pra deixar isso passar?
![Page 8: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/8.jpg)
A instrução throw, ao ser processada, avalia a expressão à direita. ◦ Se a expressão gera um Throwable, este é lançado
Ex: throw getException()◦ Se a expressão completa normalmente,
produzindo um valor não nulo, retorna esse valor Ex: throw new SograEmCasaException()
◦ Se a expressão resulta em null, o null é convertido para NullpointerException!
Lançando NullPointerExcenption
Veja mais:http://www.adarshr.com/papers/npehttp://java.sun.com/docs/books/jls/
![Page 9: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/9.jpg)
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 { //Faz alguma coisa… throw new RuntimeException(); } finally { return; } }
![Page 10: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/10.jpg)
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
![Page 11: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/11.jpg)
Como lançar uma exceção CHECADA de um método que não declara exceção!
Agora mais bizarro ainda!
import java.rmi.RemoteException;
class Thrower { public static void spit(final Throwable exception) { class EvilThrower<T extends Throwable> { @SuppressWarnings("unchecked") private void sneakyThrow(Throwable exception)
throws T { throw (T) exception; } }
new EvilThrower<RuntimeException>().sneakyThrow(exception); }}
![Page 12: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/12.jpg)
Agora mais bizarro ainda!public class ThrowerSample { public static void main( String[] args ) { Thrower.spit(new RemoteException("go unchecked!")); }}
Mim não gostar de lançar
exceção assim!
![Page 13: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/13.jpg)
Java não tem goto, mas...
Labeled Blocks
// 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 break saifora; } } }}
Quero ver isso funcionar!
![Page 14: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/14.jpg)
Labeled Blockspublic static String getErrorMsg(String _data){ String _errMsg = “”; VALIDATION: { if (_data.length() > 10) { _errMsg = “ERR: Data length exceed 10 chars”; break VALIDATION; } // Resto docódigo de validação } // Tratamento da mensagem de erro if (_errMsg.length() != 0) { _errMsg += “\nPlease fix the error.”; } return _errMsg;}
Problem?
![Page 15: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/15.jpg)
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
![Page 16: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/16.jpg)
Enum
enum Caes{ MINOTAURO(2), TITAN(3), SADAM(7);
private int idade; Caes(int idade) { this.idade = idade; } public int getIdade() { return idade; }}
![Page 17: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/17.jpg)
Enumpublic enum Salas implements Sala{ PRIMEIRA{ public Sala norte() { return SEGUNDA; } }, SEGUNDA{ public Sala sul() { return PRIMEIRA; } }
public Sala norte() { return null; } public Sala sul() { return null; } public Sala lest() { return null; } public Sala oeste() { return null; }}
public interface Sala{ public Sala norte(); public Sala sul(); public Sala leste(); public Sala oeste();}
![Page 18: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/18.jpg)
Desde a versão 1.5, o Java aceita parâmetros variáveis
Var args
public void foo(String... bars) { for (String bar: bars) System.out.println(bar);}
public void test() {
foo("first","second","third")}
![Page 19: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/19.jpg)
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);
![Page 20: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/20.jpg)
Divisão por 0public class teste { public static void main(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 ArithmeticExceptio
n
![Page 21: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/21.jpg)
Divisão por 0public class teste { public static void main(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???????
![Page 22: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/22.jpg)
Quer ver um dump da hierarquia de componentes numa aplicação Swing?◦ Ctrl + Shift + F1◦ Resultado no console◦ Boa ferramenta para depuração!
Swing
![Page 23: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/23.jpg)
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 int umMetodo(){ System.out.println(“Acessando o Google:”); http://www.google.com return 1;}
![Page 24: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/24.jpg)
Como acessar os métodos e campos privados de fora dessa classe?
Arrebentando o encapsulamento
public class Foo { private int bar; public Foo() { setBar(17); } private void setBar(int bar) { this.bar=bar; } public int getBar() { return bar; } public String toString() { return "Foo[bar="+bar+"]"; }}
![Page 25: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/25.jpg)
Arrebentando o encapsulamentoimport java.lang.reflect.*;
public class Arrebenta { public static void main(String[] args) throws NoSuchMethodException,IllegalAccessException, InvocationTargetException, NoSuchFieldException { Foo foo=new Foo(); System.out.println(foo); Method method=Foo.class.getDeclaredMethod ("setBar", int.class); method.setAccessible(true); method.invoke(foo, 42);
![Page 26: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/26.jpg)
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!
![Page 27: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/27.jpg)
Acesso esquisitopublic class Foo { static int fubar = 42;
Foo getFoo() { return null; }
public static void main(String args[]) { Foo foo = new Foo(); System.out.println(foo.getFoo().fubar); }}// saida: 42
Agora você tá de
sacanagem!
![Page 28: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/28.jpg)
É possível criar um programa sem Main!
Classe sem main!
public class WithoutMain { static { System.out.println("Look man, no main!!"); System.exit(0); }}
$ java WithoutMainLook man, no main!!
![Page 29: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/29.jpg)
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/
![Page 30: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/30.jpg)
Todo arquivo .class começa com o valor hexadecimal 0xCAFEBABE, para identificá-lo como um arquivo de Bytecode válido.
Quer exibir uma Splash screen?◦ Basta rodar o programa com o parâmetro de
máriona virtual splash:caminho
Curiosidades
java -splash:imagem.jpeg -jar Reverso.jar
![Page 31: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/31.jpg)
Classes anônimas Você pode definir uma classe anônima e
imediatamente chamar um método, mesmo que ela não implemente nenhuma interface
new Object() { void foo(String s) { System.out.println(s); }}.foo("Hello");
![Page 32: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/32.jpg)
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ão funciona com kill -9, em *nix
Shutdown Hooks
![Page 33: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/33.jpg)
Shutdown Hooks
Runtime.getRuntime().addShutdownHook( new Thread() { public void run() { endApp(); }});;
![Page 34: Java hidden features](https://reader036.vdocuments.com.br/reader036/viewer/2022081502/5572c843d8b42abb378b4bbb/html5/thumbnails/34.jpg)
Perguntas