Considero a exigência de que os campos sejam finais como excessivamente restritivos e um erro dos designers da linguagem Java. Há momentos, por exemplo, manuseio de árvore, quando você precisa definir constantes na implementação que são necessárias para realizar operações em um objeto do tipo de interface. Selecionar um caminho de código na classe de implementação é uma confusão. A solução alternativa que uso é definir uma função de interface e implementá-la retornando um literal:
public interface iMine {
String __ImplementationConstant();
...
}
public class AClass implements iMine {
public String __ImplementationConstant(){
return "AClass value for the Implementation Constant";
}
...
}
public class BClass implements iMine {
public String __ImplementationConstant(){
return "BClass value for the Implementation Constant";
}
...
}
No entanto, seria mais simples, mais claro e menos sujeito a uma implementação aberrante usar esta sintaxe:
public interface iMine {
String __ImplementationConstant;
...
}
public class AClass implements iMine {
public static String __ImplementationConstant =
"AClass value for the Implementation Constant";
...
}
public class BClass implements iMine {
public static String __ImplementationConstant =
"BClass value for the Implementation Constant";
...
}