2009-03-19 16 views
5

Estoy subiendo en la curva de aprendizaje de Swing y estoy leyendo sobre InputMap y ActionMap. El libro de O'Reilly en Swing dice que las claves para ActionMap pueden ser Object, pero por convención son String s.Java Swing ActionMap keys

¿Hay alguna razón para usar un objeto que no sea String? (por ejemplo, enum)

Creo que es una mala práctica usar literales de cadena, ya que pueden escribirse mal sin producir ningún error de compilación. Así que supongo que es una buena práctica almacenar la clave ActionMap como una variable de clase static final inmutable definida una vez (por ejemplo, MyAction.NAME).

edición: Solo para aclarar, el pensamiento que vino a la mente cuando estaba leyendo la documentación era utilizar un enum en lugar de un String. ¿Hay alguna razón por la que debería usar String?

Respuesta

2

No estoy seguro de por qué no usarías una enumeración directamente (no he mirado el libro de O'Reilly), pero en casos como este, probablemente preferiría usar un método Enum.toString() , como en

MyActions.NAME.toString() 

Esto ahorra la sobrecarga de definir tantas variables estáticas, vamos a ampliar la funcionalidad de la enumeración MyActions si desea almacenar más información sobre el estado, y garantiza una cadena única por enumeración. Todos con errores de tiempo de compilación en errores tipográficos.

Editar: Swing es anterior a Enum. ¿Puede ser esa nuestra respuesta conveniente? Mire la API para card layout. Si alguna vez hubo un diseño que suplicaba por enumeraciones, es un diseño de tarjeta (permite que el ciclo a través de una lista de componentes se muestre en el mismo lugar). Supongo que hay casos de uso en los que las cadenas pueden ser preferidas (material agregado por el usuario, por ejemplo), pero vamos: la mayoría de las veces voy a usar esto con algún tipo de patrón de estado predefinido.

+0

"No estoy seguro de por qué no usarías una enumeración directamente": ¡Exactamente! Fue lo primero que pensé. –

0

En realidad, lo que usted propone es lo que hace Swing (a veces), por lo que tiene razón.

Compruebe la clase javax.swing.DefaultEditorKit. Swing utiliza todas estas cadenas finales estáticas para crear el mapa de acción.

Sin embargo, si comprueba su inicialización para algunos de los aspectos, como WindowsLookAndFeel, también tienen literales de cadena codificados en el código fuente.