34
Java Hidden Features Traquitanas escondidas ou simplesmente pouco usadas no Java

Java hidden features

Embed Size (px)

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.

Citation preview

Page 1: Java hidden features

Java Hidden Features

Traquitanas escondidas ou simplesmente pouco usadas no Java

Page 2: Java hidden features

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

É 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

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

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

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

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

Shutdown Hooks

Runtime.getRuntime().addShutdownHook( new Thread() { public void run() { endApp(); }});;

Page 34: Java hidden features

Perguntas