Sé lo que dices.
I, por ejemplo, quieren tener una interfaz (que yo estoy llamando ExecutableList) tengo un campo de cadena contant llamada USER_FRIENDLY_NAME
public interface ExecutableList<T extends ExecutableList<T,E>,E> //This is type parameter
extends List<E>, //self referencing. Trust
Comparable<E>, //me, it has its uses.
{
/** This would declare a constant but leave it to sub-interfaces/classes to define it. */
abstract String USER_FRIENDLY_NAME;
//Define the rest of your interface
}
Por desgracia, esto no es posible en Java. Cuando declara un campo en una interfaz Java, implica los modificadores public
, static
y final
.Un cambio futuro en el Lenguaje de Programación de Java PODRÍA permitir el agregado de abstract
, haciendo los modificadores implícitos public abstract static final String USER_FRIENDLY_NAME;
, pero si bien podría definir claramente las reglas para esto, el uso de la palabra abstract
sería confuso, ya que se entiende que abstract
y final
definir significados opuestos.
Estoy cruzando los dedos para que una versión futura de Java implemente esto. He oído que los métodos de interfaz privada se agregarán en Java 9 (para usar entre los métodos predeterminados), pero aún no hay palabras sobre esta adición al idioma. Habrá una serie de problemas de compatibilidad hacia atrás para considerar primero, estoy seguro. Si alguien de Oracle lee esto, ¡POR FAVOR DEJEMOS CONSTANTES EN INTERFACES Y DEJAR QUE LAS CLASES/INTERFACES HEREDITARES LAS DEFINEN!
Mientras tanto, su única opción es definir un método String getUserFriendlyName();
en su interfaz o clase abstracta. No tan elegante y tal vez no tan eficiente, pero no tienes otra opción actualmente.
¡Probablemente vale la pena señalar que una constante con valores potencialmente diferentes no es una constante! Entonces ve con la respuesta de Peters. – TedTrippin