12 August 2011

Enquanto estava refatorando um pull request do VRaptor feito pelo acdesouza, cai numa situação estranha do java.

A idéia era criar um ponto de extensão para a classe DefaultRepresentationResult:

public DefaultRepresentationResult(...List<Serialization> serializations) {//construtor
    //...
    this.serializations = serializations;
    sortSerializations();
}
 /**
   * Override this method if you want another ordering strategy.
   *
   * @since 3.4.0
   */
protected void sortSerializations() {
       Collections.sort(this.serializations, new PackageComparator());
}

Daí se a pessoa quiser mudar a ordenação é só sobrescrever o método sortSerializations(). Até aí tudo bem, mas quão perigoso é isso?

Daí vem o seguinte puzzle:

public class Mae {
    public Mae() {
         metodo();
    }
    protected void metodo() {
        System.out.println("Mãe");
    }
}
public class Filha extends Mae {
   private final String x;
   public Filha() {
        this.x = "Testando";
   }
   @Override
   protected void metodo() {
       System.out.println(x);
   }
}

Se eu executar:

new Filha();

o que será impresso?



  • - Jonas Abreu - Fri, 12 Aug 2011 14:58:47 -0700
    null?
  • - Sergio Lopes - Fri, 12 Aug 2011 17:16:26 -0700
    Chuto que chama o sobrescrito na filha... e o atributo nao tera sido setado ainda
  • - Lucas Cavalcanti - Fri, 12 Aug 2011 21:48:02 -0700
    pois é, e por causa disso tive que fazer esse commit: https://github.com/caelum/vraptor/commit/45772be44c5a4660e074ee9b43cfc59e8aa6f9a0 senão as pessoas que sobrescrevessem a classe não iam poder usar dependências para implementar o sortSerializations(). Bizarro cair nesse caso, não?