Considero que el requisito de que los campos sean finales es excesivamente restrictivo y un error de los diseñadores del lenguaje Java. Hay ocasiones, por ejemplo, en el manejo de árboles, en las que es necesario establecer constantes en la implementación que son necesarias para realizar operaciones en un objeto del tipo de interfaz. Seleccionar una ruta de código en la clase de implementación es un fastidio. La solución alternativa que utilizo es definir una función de interfaz e implementarla devolviendo un 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";
}
...
}
Sin embargo, sería más simple, más claro y menos propenso a una implementación aberrante usar esta sintaxis:
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";
...
}