2012-07-24 29 views
15

Ho un tipo enum (ad esempio per argomento sa CarModel), utilizzato in un'applicazione (numerose classi).metodi get() in tipo enum Java

public enum CarModel { 
    DIABLO, 
    P911, 
    DB7; 
} 

ho vari metodi che utilizzano questo tipo enum CarModel in modi diversi, e ciascuno ha un'istruzione switch per impostare alcune String variabile a seconda del tipo enum, prima di andare a fare altre cose. (ad esempio, impostare il produttore di alcuni modelli, o impostare il paese di origine ecc. Questi risultati sono statici in fase di esecuzione)

Il problema è, se voglio aggiungere un nuovo modello all'enumerazione, dovrei andare a ciascun metodo e estendere/modificare l'istruzione switch per gestirne l'esistenza. Ciò potrebbe facilmente portare all'errore umano e/o alla duplicazione del codice (se vari metodi utilizzano le stesse istruzioni switch).

Invece di utilizzare istruzioni switch all-over, mi piacerebbe avere metodi statici, che potrebbero essere modificati in un unico luogo, e permetterebbe un comportamento simile al seguente:

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

Questo è possibile con un enum, (ed è un enum anche il modo 'corretto' per fare questo?

risposta

26

si può fare qualcosa di simile.

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

Lo faccio sempre, amo assolutamente queste funzionalità di enumerazione. – Malcolm

+0

+1 molto bello !!! vecchio stile enum. – BlaShadow

1

Inoltre enumerazioni possono implementare un'interfaccia. è possibile aggiungere alcuni get() metodi come getMaxSpeed() o getWeight(). interfaccia può apparire come

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

Se si utilizzerà l'enumerazione, suggerirei un metodo astratto dichiarato nell'enumerazione e quindi un'implementazione fornita per ogni istanza di enum.

In questo modo non si dispone di istruzioni switch in tutto il mondo (da cui si può facilmente escludere i casi) e si ha un più affidabile e OO-designato approccio polymorphic.

abstract public int getEngineSize(); 

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

Vedere here Per ulteriori esempi/discussioni ecc

+0

non avevo mai visto prima – NimChimpsky

+0

@NimChimpsky: Nessuna sorpresa, perché gli altri metodi come quello Korgen spettacoli sono molto più semplici e utilizza meno codice. –

+0

@ A.H. Credo di sì, realizzano la stessa cosa ma questo è piuttosto strano, e meno leggibile - è il loro vero vantaggio che mi manca? – NimChimpsky

7

Sì, assolutamente. Le enumerazioni possono avere i propri metodi e quei metodi possono essere specifici del valore. Assomiglia a questo:

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

È possibile aggiungere più metodi, ovviamente.

+0

Siamo spiacenti. Ho dovuto aggiungere il produttore di DB7 :-) –

+0

Grazie, non un ragazzo di macchina :) –

1

Sì, questo è abbastanza facile da fare:

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

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

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

vorrei suggerire di aggiungere queste informazioni direttamente nella vostra enum.

Ti piace questa:

public enum CarModel { 

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

    private String manufacturer; 


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

    public String getManufacturer() { 
     return manufacturer; 
    }  
} 

e nella classe che avrebbe dovuto utilizzare solo il metodo getManufacturer