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?
null?
Chuto que chama o sobrescrito na filha... e o atributo nao tera sido setado ainda
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?