Posso creare un tipo di enum Java vuoto, ma quando voglio aggiungere alcuni metodi: ottengo un "errore di sintassi" (in Eclipse). Non ho trovato documentazione ufficiale su questo, quindi la mia domanda è: è semplicemente impossibile (quindi dove è chiaramente menzionato?) O è solo il compilatore che è sbagliato?È possibile creare un tipo enum Java vuoto con metodi?
risposta
Sì, è possibile. Hai solo bisogno di aggiungere un ;
per terminare la lista (vuoto) di costanti enum:
enum TestEnum {
; // doesn't compile without this.
public void hello() {
System.out.println("Hello World");
}
}
JLS Syntax Definition for enum
s
(Si noti che, senza tutte le istanze, sarete solo in grado di chiamare i metodi del static
enum)
correlati:.
Il metodo ciao sarebbe impossibile da chiamare, vero? Non riesco a vedere il punto di tale costrutto. –
Così com'è sì. Forse i suoi metodi sono "statici", non lo so. Ma sì, sono d'accordo con te. Sembra un po 'imbarazzante. – aioobe
Grazie a @aioobe per la risposta e il collegamento. Voglio farlo perché penso sia un modo naturale, e molto facile/comprensibile, di implementare una classe non-instanciable (tipicamente una classe di utilità con solo metodi statici di definizione): per me è più naturale dire "un la classe non-instanciable è un enum senza elemento "(cioè permette di non usare istanze di se stessa) che dire" dovrebbe essere implementato con un costruttore privato che lancia un AssertionError "(cfr. Java efficace n. 4). Ma è solo il mio punto di vista, quindi non esitate a sfidarmi se sbaglio ... – cedric
sì, è:
È necessario aggiungere un punto e virgola (;
) per terminare la lista vuota di enumerazioni.
Questo compila:
public enum MyEnum {
;
public void method() {
}
}
Anche se non riesco a pensare che cosa sarebbe utile per.
I metodi possono essere utili, quando le enumerazioni sono composte da campi .. quindi diciamo che hai un enumeratore COLORS che ha una rappresentazione int, una rappresentazione di stringa breve e una rappresentazione di stringa di visualizzazione .. allora questo enum può avere metodi come getInteger(), getShortString(), getDisplayString() .. quindi, per esempio, viene mostrato sulla GUI usando l'opzione getDisplayString() ... forse memorizzato nel DB usando l'opzione getShortString() ... – Scorpion
Penso che ciò che Bohemian significa è che non può pensare a nulla di utile con un * vuoto * enum con i metodi. – aioobe
Sì, qualsiasi metodo di istanza di questo tipo sarebbe inaccessibile. Inoltre, non riesco a pensare a molto utile da fare con un enum vuoto. – Bohemian
Absoulely,
/**
* @author The Elite Gentleman
* @since 06 September 2011
*
*/
public enum ExampleEnum {
WHAT_ENUM
;
public void doOperation() {
}
}
tardi:
ExampleEnum exEnum = ExampleEnum.WHAT_ENUM;
exEnum.doOperation();
Naturalmente è possibile! "Ia! Ia! Cthulhu Fthagn! Ph'nglui mglw'nfah Cthulhu R'lyeh wgah'nagl fhtagn !!"
idea originale: "http://www.theserverside.com/news/thread.tss?thread_id=50190"
Distruggere la realtà a proprio rischio.
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
enum ThingsThatShouldNotBe {
;
public void HelloWorld() {
System.out.println(this.name() + " Says Hello!");
}
public static void main(String[] args) throws Exception {
Constructor<?> con = ThingsThatShouldNotBe.class.getDeclaredConstructors()[0];
Method[] methods = con.getClass().getDeclaredMethods();
for (Method m : methods) {
if (m.getName().equals("acquireConstructorAccessor")) {
m.setAccessible(true);
m.invoke(con, new Object[0]);
}
}
Field[] fields = con.getClass().getDeclaredFields();
Object ca = null;
for (Field f : fields) {
if (f.getName().equals("constructorAccessor")) {
f.setAccessible(true);
ca = f.get(con);
}
}
Method m = ca.getClass().getMethod("newInstance",
new Class[] { Object[].class });
m.setAccessible(true);
ThingsThatShouldNotBe v = (ThingsThatShouldNotBe) m.invoke(ca, new Object[] { new Object[] { "Cthulhu",
Integer.MAX_VALUE } });
System.out.println(v.getClass() + ":" + v.name() + ":" + v.ordinal());
System.out.println("Say hello Cthulhu!");
v.HelloWorld();
}
}
Mwu HA HA HA HA HA HA.
Se hai davvero bisogno di un Enum e vuoi che abbia metodi di istanza, e hai deciso di convocare gli antichi dei della riflessione per forzare questo abominio sul mondo, allora è utile.
Questo confonderà definitivamente altri sviluppatori in futuro.
- 1. metodi get() in tipo enum Java
- 2. Swift: Impossibile creare array vuoto di tipo annidato enum
- 3. È vuoto enum (enum {};) portatile?
- 4. Parametro enum generico in java. È possibile?
- 5. È possibile creare metodi * con valori tabella * in un tipo definito dall'utente CLR SQL?
- 6. I metodi Java possono restituire il tipo Enum?
- 7. È possibile creare un array multidimensionale vuoto in javascript/jquery?
- 8. È possibile creare un TH con TableRow.insertCell()?
- 9. Associazione di un tipo generico con Enum in Java
- 10. È possibile creare metodi di estensione con 2.0 Framework?
- 11. Le istanze enum sono "racchiuse" nel tipo enum in java?
- 12. implementazione Singleton con un Enum (in Java)
- 13. Converti puntatore vuoto ** a tipo Java equivalente
- 14. In Java, perché è possibile qualificare una costante Enum con un'altra costante Enum?
- 15. Non è possibile creare un array di LinkedList in Java ...?
- 16. È possibile creare eventi personalizzati con UIControlEventApplicationReserved?
- 17. IEnumerable Metodi di estensione su un Enum
- 18. È possibile creare un nuovo tipo più dinamico?
- 19. Convertire da enum ordinal a enum tipo
- 20. Posso creare interfacce tipo Java in Perl?
- 21. È possibile utilizzare Java per creare dll?
- 22. passano tipo enum generico come parametro (java)
- 23. creare un ramo vuoto
- 24. Come creare un file vuoto con Ansible?
- 25. È possibile creare un nuovo tipo di dati primitivo in Java
- 26. È possibile creare la mia Eccezione non controllata in Java?
- 27. Classi Enum multiple in un file Java
- 28. Come confrontare la stringa con il tipo enum in Java?
- 29. Java Enum Tipo di codificazione Convenzione
- 30. Java Enum: metodi di implementazione dopo la dichiarazione?
se pubblichi il codice che ha dato l'errore, saremo in grado di dare una risposta più elaborata. – tb189
perché ti piacerebbe avere un enum vuoto? – maasg
Potrebbe voler creare un set di quell'Enum in fase di runtime, ma ha ancora comportamenti di istanza. – ggb667