type tutorial mkyong example enum define create java enums runtime

mkyong - enum java tutorial



Cambiando Enum en tiempo de ejecuciĆ³n Java (2)

Los enumeradores son objetos estáticos, finales, inmutables, controlados por instancias que tienen el sentido de constantes. Debería pensar en una enumeración siempre que su proyecto contenga una agrupación natural o una lista de cosas que se conocen en tiempo de compilación.

La JVM garantiza que las enumeraciones están controladas por instancia e inmutables en tiempo de ejecución. La compatibilidad binaria de las enumeraciones también está garantizada de modo que si, más adelante, agrega constantes enum, sus programas continuarán ejecutándose.

La respuesta corta es: "no, no hay una forma fácil de extender una clase enum en Java".

Una alternativa es tener una base enum implementar una interfaz que sirva como el tipo base para las constantes enum.

Entonces es posible "extender" la enumeración creando una nueva enumeración que implementa la interfaz. Aun así, esto no es algo que, por diseño, haya tenido la intención de tener lugar en el momento de la ejecución.

¿Hay alguna forma de agregar elementos a una clase enum incorporada en Java?

Mi pregunta es similar a ¿Puedo agregar y quitar elementos de enumeración en tiempo de ejecución en Java , pero esa pregunta parece estar orientada a construir tu propia enumeración y luego modificarla? Supongo que hay una enumeración existente en alguna parte que no puedo cambiar, algo así como

enum Days{ MONDAY, TUESDAY, WEDNESDAY }

y quiero agregarle jueves, viernes, etc. Desafortunadamente, las sugerencias de cómo usar una interfaz para lograr mi objetivo u otros métodos que serían más efectivos que las enumeraciones no se aplican aquí.

Según entiendo, las enumeraciones son implícitamente finales, por lo que no puedo extenderlo y agregarle más elementos. Tiene campos privados, pero parece que puedo utilizar la reflexión para acceder a ellos. ¿Podría cambiar uno de los campos privados, incluso si no puedo agregar uno nuevo, es decir, cambiar de lunes a jueves?

Editar: Aclaración de las circunstancias

La gente sugirió alterar el código antes de compilarlo en el programa. Mi código es parte de un proyecto más grande que no puedo cambiar; la clase con la enumeración está cargada por el programa más grande antes de que mi clase tenga acceso a ella. En ese punto, me gustaría agregar los elementos faltantes a la enumeración. ¿La manipulación de bytecode sigue siendo el camino a seguir?


Puedes cambiar una enumeración en tiempo de ejecución para alterar la clase en tiempo de ejecución antes de cargarla. Puede compilar una enumeración modificada en tiempo de ejecución y cargarla o puede usar la manipulación de código de bytes para modificarla.

En resumen, incluya todas las enumeraciones que necesita y nunca debería necesitar agregarlas en tiempo de ejecución. por ejemplo, si solo hay siete días en una semana, inclúyalos todos en el momento de la compilación.