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?
Respuesta
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 enum
s
(Tenga en cuenta que, sin ninguna instancia, sólo podrá llamar a los métodos de la static
enum)
relacionadas:.
El método de saludo sería imposible de llamar, ¿no es así? No veo el sentido de tal construcción. –
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
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
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.
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
Creo que lo que Bohemian quiere decir es que no se le ocurre nada útil con una * enum vacía * con métodos. – aioobe
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
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();
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.
- 1. métodos get() en Java enumeración tipo
- 2. ¿Es posible determinar si un tipo es un tipo de enumeración con ámbito?
- 3. ¿Es posible guardar un Tipo (usando "typeof()") en una enumeración?
- 4. ¿Es posible crear métodos de extensión con Framework 2.0?
- 5. Java: ¿es posible generar la stacktrace con firmas de métodos?
- 6. ¿Es posible crear un TH con TableRow.insertCell()?
- 7. ¿Es posible crear una matriz multidimensional vacía en javascript/jquery?
- 8. Java valor de enumeración personalizada es posible enumerar los
- 9. Métodos de extensión de enumeración
- 10. ¿Es posible crear * métodos * con valores de tabla en un CLR SQL de tipo definido por el usuario?
- 11. ¿Cómo crear una carpeta vacía en java?
- 12. ¿Es posible crear clases Java desde JavaDoc?
- 13. ¿Cómo puedo crear un tipo de enumeración en Perl?
- 14. ¿Es posible crear colecciones de Java seguras de tipo cuyos miembros simplemente implementen varias interfaces?
- 15. ¿Es posible usar Java para crear dll?
- 16. ¿Es posible redefinir los métodos Java de Clojure?
- 17. ¿Es posible agregar otro elemento a un tipo de enumeración existente?
- 18. ¿Es posible crear un operador personalizado en Java?
- 19. ¿Puedo crear interfaces tipo Java en Perl?
- 20. ¿Es posible crear mi propia excepción no revisada en Java?
- 21. ¿Es posible extender Java Enums?
- 22. ¿Es posible anular un campo de tipo?
- 23. ¿Es posible crear un applet web JavaFX?
- 24. ¿Es posible crear "Solución vacía" con Visual Web Developer 2010 Express?
- 25. Java - Crear una matriz de métodos
- 26. ¿Herencia de enumeración en Java?
- 27. ¿Es posible crear un vector de punteros?
- 28. ¿Es posible crear un interbloqueo con acceso de solo lectura?
- 29. ¿Es posible especializar una plantilla usando una enumeración de miembro?
- 30. ¿Perl tiene un tipo de enumeración?
si publica el código que dio el error, podremos dar una respuesta más elaborada. – tb189
¿por qué le gustaría tener una enumeración vacía? – maasg
Es posible que desee crear un conjunto de ese Enum en tiempo de ejecución, pero todavía tiene comportamientos de instancia. – ggb667