2011-09-06 9 views
9

Puedo crear un tipo de enumeración Java vacía, pero cuando quiero agregar algunos métodos: obtengo un "error de sintaxis" (en Eclipse). No encontré documentación oficial sobre esto, así que mi pregunta es: ¿es simplemente imposible (entonces, ¿dónde se menciona claramente?) ¿O es solo el compilador el que está equivocado?¿Es posible crear un tipo de enumeración Java vacía con métodos?

+0

si publica el código que dio el error, podremos dar una respuesta más elaborada. – tb189

+3

¿por qué le gustaría tener una enumeración vacía? – maasg

+0

Es posible que desee crear un conjunto de ese Enum en tiempo de ejecución, pero todavía tiene comportamientos de instancia. – ggb667

Respuesta

16

Sí, es posible. Sólo tiene que añadir un ; para terminar la lista (vacío) de las constantes de enumeración:

enum TestEnum { 
    ;       // doesn't compile without this. 
    public void hello() { 
     System.out.println("Hello World"); 
    } 
} 

JLS Syntax Definition for enums

(Tenga en cuenta que, sin ninguna instancia, sólo podrá llamar a los métodos de la static enum)

relacionadas:.

+0

El método de saludo sería imposible de llamar, ¿no es así? No veo el sentido de tal construcción. –

+0

Tal como está, sí. Quizás sus métodos son 'estáticos', no sé. Pero sí, estoy de acuerdo contigo. Parece un poco incomodo. – aioobe

+3

Gracias @aioobe por la respuesta y el enlace. Quiero hacer esto porque creo que es una forma natural, y muy fácil/comprensible, de implementar una clase no instanciable (generalmente una clase de utilidad con solo métodos estáticos por definición): para mí es más natural decir "un la clase no instanciable es una enumeración sin elemento "(es decir, que permite no usar ninguna instancia de sí mismo) que decir" debe implementarse con un constructor privado que arroje un AssertionError "(véase la versión Java efectiva nº 4). Pero solo es mi punto de vista, así que no dudes en desafiarme si estoy equivocado ... – cedric

5

sí, es:

Es necesario añadir un punto y coma (;) para terminar la lista vacía de enumeraciones.
Esto compila:

public enum MyEnum { 
    ; 
    public void method() { 

    } 
} 

Aunque no puedo imaginar lo que sería útil para.

+1

Los métodos pueden ser útiles, cuando las enumeraciones están compuestas por campos ... así que tenga un ENUM COLORS que tenga una representación int, una representación de cadena corta y una representación de cadena de visualización ... entonces esta enumeración puede tener métodos como getInteger(), getShortString(), getDisplayString() .. así que, por ejemplo, se mostrará en la GUI usando la opción getDisplayString() ... tal vez almacenada en el DB usando la opción getShortString() ... – Scorpion

+2

Creo que lo que Bohemian quiere decir es que no se le ocurre nada útil con una * enum vacía * con métodos. – aioobe

+1

Sí, cualquiera de estos métodos de instancia sería inaccesible. Además, no se me ocurre mucho que hacer con una enumeración vacía. – Bohemian

1

Absoulely,

/** 
* @author The Elite Gentleman 
* @since 06 September 2011 
* 
*/ 
public enum ExampleEnum { 
    WHAT_ENUM 
    ; 

    public void doOperation() { 

    } 
} 

después:

ExampleEnum exEnum = ExampleEnum.WHAT_ENUM; 
exEnum.doOperation(); 
6

Por supuesto que puedes! "¡Ia! ¡Ia! Cthulhu Fthagn! Ph'nglui mglw'nfah Cthulhu R'lyeh wgah'nagl fhtagn !!"

Idea original: "http://www.theserverside.com/news/thread.tss?thread_id=50190"

Destruir la realidad a su propio riesgo.

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.

Si realmente necesita un Enum y quiere que tenga métodos de instancia, y ha resuelto convocar a los dioses de la reflexión para forzar esta abominación sobre el mundo, entonces es útil.

Esto definitivamente confundirá a los demás desarrolladores más tarde.

Cuestiones relacionadas