• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Java hidden features
 

Java hidden features

on

  • 893 views

 

Statistics

Views

Total Views
893
Views on SlideShare
889
Embed Views
4

Actions

Likes
0
Downloads
4
Comments
0

1 Embed 4

http://www.linkedin.com 4

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Java hidden features Java hidden features Presentation Transcript

    • Java HiddenFeatures
      Traquitanas escondidas ou simplesmente pouco usadas no Java
    • 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 += “nPleasefixtheerror.”;     }
          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);
      privateintidade;
      Caes(int idade) {
      this.idade = idade;
      }
      publicintgetIdade() {
      returnidade;
      }
      }
    • Enum
      publicenumSalas implements Sala{
      PRIMEIRA{
      publicSala norte() {
      returnSEGUNDA;
      }
      },
      SEGUNDA{
      publicSala sul() {
      returnPRIMEIRA;
      }
      }
      publicSala 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;
      doubley = 33.75;
      System.out.printf("x = %f y = %g", x, y);
      double x = 27.5;
      doubley = 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{
      doublex = 15;
      double z = 0;
      doubley = 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.*;
      publicclassArrebenta {
      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(
      newThread() {
      publicvoidrun() {
      endApp();
      }
      });;
    • Perguntas