2012-07-24 13 views
15

Tengo un tipo de enumeración (por ejemplo, argumentos sake CarModel), que se utiliza en una aplicación (numerosas clases).métodos get() en Java enumeración tipo

public enum CarModel { 
    DIABLO, 
    P911, 
    DB7; 
} 

tengo varios métodos que utilizan este tipo CarModel enumeración de diferentes maneras, y cada uno tiene una sentencia switch para establecer algún String variable en función del tipo de enumeración, antes de pasar a hacer otras cosas. (por ejemplo, establecer el fabricante de algún modelo, o establecer el país de origen, etc. Estos resultados son estáticos en tiempo de ejecución)

El problema es que si quiero agregar un nuevo modelo a la enumeración, tendría que ir a cada método, y extender/modificar la declaración de cambio para manejar su existencia. Esto podría conducir fácilmente a errores humanos y/o duplicación de código (si varios métodos usan las mismas declaraciones de cambio).

En lugar de utilizar las sentencias switch all-over, me gustaría disponer de métodos estáticos, que podrían ser editados en un solo lugar, y permitiría un comportamiento similar al siguiente:

String country = CarModel.DIABLO.getCountry() // returns Italy 
String manufacturer = CarModel.P911.getManufacturer() // returns Porsche 

Es esto posible con una enumeración, (y es una enumeración incluso la forma 'correcta' de hacer esto?

Respuesta

26

Usted puede hacer algo como esto.

public enum CarModel { 
    DIABLO("Lamborghini", "Italy"), 
    P911("Porsche", "Germany"); 

    private String manufacturer; 
    private String country; 

    private CarModel(String manufacturer, String country) { 
     this.manufacturer = manufacturer; 
     this.country = country; 
    } 

    public String getManufacturer() { 
     return manufacturer; 
    } 

    public String getCountry() { 
     return country; 
    } 
} 
+0

Hago esto todo el tiempo, me encantan estas características de enums. – Malcolm

+0

+1 muy guay !!! estilo antiguo enum. – BlaShadow

1

Además enumeraciones pueden implementar una interfaz. se pueden añadir algunos métodos como get()getMaxSpeed() o getWeight(). interfaz puede parecer

interface car{ 
public int getMaxSpeed(); 
public int getWeight(); 
} 
3

Si va a utilizar enumeraciones, sugeriría un método abstracto declarado en la enumeración, y luego una implementación provista para cada instancia enum.

De esa manera usted no tiene instrucciones switch en todas partes (de la que se puede omitir fácilmente casos) y tiene un enfoque más fiable y OO-estilo polymorphic.

abstract public int getEngineSize(); 

DIABLO { 
    public int getEngineSize() { 
     return 6.3; // whatever it really is... 
    } 
} 

Ver here para más ejemplos/discusiones etc.

+0

que nunca había visto esto antes – NimChimpsky

+0

@NimChimpsky: No es de extrañar, ya que otros métodos como el que se muestra Korgen son mucho más simples y utiliza menos código. –

+0

@ A.H. Supongo que sí, logran lo mismo, pero esto es bastante extraño, y menos legible. ¿Me están perdiendo alguna ventaja real? – NimChimpsky

7

Sí, absolutamente. Los enums pueden tener sus propios métodos, y esos métodos pueden ser específicos del valor. Se ve así:

enum CarModel { 
    P911 { 
     public String getManufacturer() { return "Porsche"; } 
    }, 
    DB7 { 
     public String getManufacturer() { return "Aston Martin"; } 
    }, 
    ... 
    public abstract String getManufacturer(); 
} 

Puede agregar más métodos, por supuesto.

+0

Lo siento. Tuve que agregar el fabricante DB7 :-) –

+0

Gracias, no es un tipo de coche :) –

1

Sí, esto es bastante fácil de hacer:

public enum CarModel { 
    DIABLO("rod"), 
    P911("jane"), 
    DB7("freddy"); 

    private String name; 
    CarModel(String name){ 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 
2

que sugeriría la adición de esta información directamente en su enumeración.

De esta manera:

public enum CarModel { 

    DIABLO("Lambo"), 
    P911 ("Porsche"); 

    private String manufacturer; 


    private CarModel(String manufacturer) { 
     this.manufacturer = manufacturer; 
    } 

    public String getManufacturer() { 
     return manufacturer; 
    }  
} 

y en la clase sólo se tendría que utilizar el método getManufacturer

Cuestiones relacionadas