2010-03-17 12 views
6

C'è un modo per forzare le classi in Java ad avere un campo finale statico pubblico (tramite interfaccia o classe astratta)? O almeno solo un campo pubblico?Un modo per forzare le classi ad avere un campo finale statico pubblico in Java?

ho bisogno di fare in modo in qualche modo che un gruppo di classi hanno

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

in loro.

+0

Cosa stai cercando di fare? Stai facendo qualcosa che usa la riflessione, giusto? Altrimenti non avresti il ​​problema (se il campo è referenziato con 'MyClass.field' ma non esiste non verrà compilato in modo implicito, o il campo non è referenziato nel qual caso non ti interessa) – ewernli

+0

Si potrebbe voler considerare una fabbrica o simile. –

+0

@Tom Perché preoccuparsi di una classe di mappatura -> TYPE? Basta usare il nome completo della classe. – ewernli

risposta

7

No, non è possibile.

È possibile forzare solo loro di avere un metodo getter non statico, che restituisce il valore appropriato per ogni sottoclasse:

public abstract String getType(); 

Se avete bisogno di mappare ogni sottoclasse di qualcosa ad un valore, senza la bisogno di un'istanza, è possibile creare un qualche public static Map<Class<?>, String> types;, popolato è staticamente con tutte le classi e le loro tipologie, e ottenere il tipo chiamando TypesHolder.types.get(SomeClass.class)

1

non v'è alcun modo per avere il compilatore far rispettare questo, ma vorrei esaminare la creazione di un'usanza FindBugs o CheckStyle regola che potrebbe verificare questo.

1

Non credo sia possibile. Ma si potrebbe fare un'interfaccia con un metodo getType

5

È possibile definire un'interfaccia simile a questo:

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

e si può fare classi implementano l'interfaccia che poi avere quel campo con lo stesso valore dichiarato in l'interfaccia. Si noti che questa pratica è denominata Constant interface anti-pattern.

Se si desidera che le classi abbiano valori diversi allora si può definire una funzione nell'interfaccia come questo:

interface X { 
    public String getType(); 
} 

e l'attuazione di corsi dovrà implementare la funzione che può restituire valori diversi a seconda delle necessità.

Nota: questo funziona in modo simile anche con classi astratte.

+0

+1: stavo per svendere un'altra risposta perché non avevo realizzato che l'OP voleva avere solo l'identificatore, non il valore, essere lo stesso. – Pops

0

Implementare un'interfaccia nelle classi e chiamare un metodo da tale interfaccia, come suggerito da others.

Se è necessario disporre di un campo statico, è possibile eseguire un test unitario che passerà attraverso le classi e verificherà con Reflection API che ogni classe abbia quel campo finale statico pubblico. Fallire la build se non è questo il caso.

0

O almeno solo un campo pubblico?

Questo è IMO la solita strada da percorrere: nella superclasse, richiedono un valore nel costruttore:

public abstract class MyAbstract { 

    private final String type; 

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

    public String getType() { 
    return type; 
    } 
} 

In questo modo, tutte le implementazioni devono chiamare quella super-costruttore - e non hanno implementare getType() ciascuno.

+0

Ma non è possibile chiamare getType() staticamente. –

+0

No, non puoi. Ma quella era la seconda parte della sua domanda: "... avere un campo finale statico pubblico ... O almeno solo un campo pubblico?" Quindi capisco la domanda come: mi piacerebbe farlo in modo statico, ma se ciò non è possibile, almeno non in modo statico. –

Problemi correlati