2010-08-27 26 views
9

Esto puede parecer una pregunta trivial, pero estoy un poco confuso en mi forma de pensar con respecto a las enumeraciones ..Java enumeración mejores prácticas

así que tengo una clase - digamos que su llamada DVDPlayer - y yo quiero tener una enumeración que representa si está ENCENDIDO, APAGADO o EN ESPERA.

Así que puedo poner la enumeración en la clase, no tiene sentido fuera de la clase. Mi pregunta es esta: ¿debería la enumeración ser pública, para que otras clases puedan consultar valores, o debería hacerlo privada, y luego tener los métodos "isOn", "isOFf" y "isStandby"?

Esto último suena un poco tonto, pero no estoy seguro de si es una buena idea tener la enumeración como pública también.

Respuesta

8

Yo diría que parece una buena idea hacerlo público. La razón principal es que la aplicación es más fácil de extender ya que no tendría que pensar en agregar nuevos métodos cada vez que agregue un estado.

Si decide hacerlo público, debería considerar tenerlo como enum de nivel superior. Realmente no veo por qué dices "no tiene sentido fuera de la clase". Creo que un DVDPlayerState suena como una enumeración pública/de nivel máximo perfectamente perfecta.

+0

Pensé que el estado no debería tener una vida aparte del DVDPlayer; solo tiene un significado con respecto al DVDPlayer. – pecks

+6

Al mismo tiempo, podría. Es posible que tenga un DvdPlayerRemoteControl que está muy interesado en qué estados puede tener el DvdPlayer. – mikek

+0

cierto. Cambié el ejemplo en oder para publicarlo aquí, ¡así que probablemente no lo he pensado tanto! – pecks

2

Depende de cómo desea utilizar la clase DVDPlayer del mundo exterior:

if (dvdPlayer.getState() == State.ON) 

o

if (dvdPlayer.isOn()) 

creo que la primera es una mejor opción. No tiene que contaminar su código con métodos de delegación.

+0

tienes razón, esto es exactamente a lo que se reduce. – pecks

+1

En realidad, prefiero este último porque isOn() lee mucho más rápido que entender lo que podría significar un estado, para lo cual primero deberías buscar la enumeración. –

0

Hacer la enumeración pública podría tener sentido. A continuación, tendría algo como esto:

DvdPlayer.State getState(); 

Si sólo tiene tres estados, puede ser preferible utilizar los métodos Ison, isOff y isStandby. Para más estados, la enumeración pública es mejor. También se puede usar una enumeración en una declaración de cambio, que es conveniente.

2

Como regla general, quiere mantener las cosas lo más privadas posible (aunque, por lo general, ese no es el caso de uso con enumeraciones), pero por la forma en que se formula su pregunta, no estoy seguro de que esté utilizando enums Como era la intención.

Desea utilizar una enumeración para representar valores fijos; es una alternativa más limpia a guardar estos valores como enteros enteros estáticos o cadenas. Así que para una enumeración declarada como

public enum DvdState { ON, OFF, STANDBY }; 

Su clase se vería un poco como esto:

public class DvdPlayer { 
    private DvdState state = DvdState.OFF; 

    public void setState(DvdState state) { 
     this.state = state; 
    } 
} 

y una clase llamada podría utilizar el siguiente código:

dvdPlayer.setState(DvdState.ON); 
+0

Esta forma de pensar se parece mucho a la sobreingeniería. Quiero encender o apagar un jugador. Nadie diría que quiere cambiar o establecer el estado del jugador ... –

0

Si el enum es parte de la interfaz pública, tiene sentido declararlo público. Ese parece ser el caso con el DVPlayer, porque dices que se puede consultar.Los tres métodos "isOn", "isOFf" y "isStandby" abotan innecesariamente la interfaz pública.

Pero hay ocasiones en que un enum es útil para usar dentro de la clase, en cuyo caso debe declararse privado. Por ejemplo, la siguiente declaración

private enum Format{DVD, BLURAY}; 

estaría bien, si Formato se utiliza internamente en el DVDPlayer clase pero no es parte de la interfaz pública, ya sea como un valor de parámetro o el retorno de un método.

0

Creo que seré el primero en abogar por el uso de métodos aquí. Primero, piensa en los usuarios de tu clase. Cuanto menos necesiten saber sobre el dominio de su negocio, mejor, así que no los confunda con cosas como "estado". Usted no "configuraría el estado" de un reproductor de DVD en la vida real, sino simplemente "enciéndalo" o "enciéndalo si está apagado", lo que para mí es un grito de métodos. Además de que Java es conocido y adorado por ser estrictamente estáticamente tipado, lo que le permite descubrir una interfaz únicamente por las sugerencias de autocompletar de su IDE. Leer un método turnOff tiene sentido instantáneamente para mí, mientras que setState es ambiguo y me obligaría a buscar primero la enumeración de estado para saber qué es realmente el estado.