2010-03-17 15 views
6

¿Hay alguna manera de forzar que las clases en Java tengan un campo público estático final (a través de la interfaz o clase abstracta)? ¿O al menos solo un campo público?¿Alguna forma de forzar a las clases a tener un campo final público estático en Java?

que necesita para asegurarse de alguna manera que un grupo de clases tiene

public static final String TYPE = "...";

en ellos.

+0

¿Qué estás tratando de hacer? Estás haciendo algo que usa el reflejo, ¿verdad? De lo contrario, no tendrías el problema (si el campo está referenciado con 'MyClass.field' pero no existe, no se compilará, por lo que se impone implícitamente, o el campo no está referenciado, en cuyo caso no te importa) – ewernli

+0

Es posible que desee considerar una fábrica o similar. –

+0

@Tom ¿Por qué molestarse con un mapeo Clase -> TIPO? Solo usa el nombre completo de la clase. – ewernli

Respuesta

7

No, no puedes.

Sólo puede obligarlos a tener un método getter no estático, que devolvería el valor apropiado para cada subclase:

public abstract String getType(); 

Si necesita mapear cada subclase de algo a un valor, sin la necesario crear una instancia, puede crear un algún lugar public static Map<Class<?>, String> types;, llenarla de forma estática con todas las clases y sus tipos, y obtener el tipo llamando TypesHolder.types.get(SomeClass.class)

1

no hay manera de tener el compilador de hacer cumplir esto, pero yo buscaría en la creación una personalizada FindBugs o CheckStyle regla que podría verificar esto.

1

No creo que sea posible. Sin embargo, usted podría hacer una interfaz con un método getType

5

Se puede definir una interfaz como esta:

interface X { 
    public static final String TYPE = "..."; 
} 

y usted puede hacer clases implementan esa interfaz que a su vez tienen ese campo con el mismo valor declarado en la interfaz. Tenga en cuenta que esta práctica se llama Constant interface anti-pattern.

Si quieres clases tengan valores diferentes entonces se puede definir una función en la interfaz de la siguiente manera:

interface X { 
    public String getType(); 
} 

e implementación de las clases tendrá que implementar la función que puede devolver valores diferentes según sea necesario.

Nota: Esto funciona de manera similar con las clases abstractas también.

+0

+1: estaba a punto de rechazar otra respuesta porque no me di cuenta de que OP deseaba tener solo el identificador, no el valor, ser el mismo. – Pops

0

Implemente una interfaz en sus clases y llame a un método desde esa interfaz, como lo sugirió others.

Si debe tener absolutamente un campo estático, puede hacer una prueba de unidad que pasará por las clases y verifica con Reflection API que cada clase tiene ese campo público estático final. Fallar la construcción si ese no es el caso.

0

O al menos solo un campo público?

Esa es la OMI de la forma habitual para ir: En la superclase, requieren un valor en el constructor:

public abstract class MyAbstract { 

    private final String type; 

    protected MyAbstract(String type) { 
    this.type = type; 
    } 

    public String getType() { 
    return type; 
    } 
} 

De esta manera, todas las implementaciones deben llamar a ese super-constructor - y no tienen para implementar getType() cada uno.

+0

Pero no puede llamar a getType() estáticamente. –

+0

No, no puedes. Pero esa fue la segunda parte de su pregunta: "... tener un campo final público estático ... ¿O al menos solo un campo público?" Así que entiendo la pregunta como: me gustaría hacerlo estáticamente, pero si eso no es posible, al menos de forma no estática. –

Cuestiones relacionadas