2013-01-21 1 views
13

Perché questo enum è dichiarato nel proprio file. C'è un vantaggio in questo? Inoltre, come potrei metterlo in uno dei 2 file. Non ho idea di cosa sto facendo. Per favore, spiega anche questo in un modo semplice, dal momento che questo è un esempio da manuale, e io sono abbastanza nuovo in Java.Perché un enum è dichiarato in un file separato, in Java?

ScaleName.java

enum ScaleName {celsius, fahrenheit, kelvin, rankine}; 

Temperature.java

class Temperature { 

    private double number; 
    private ScaleName scale; 

    public Temperature() { 
     number = 0.0; 
     scale = ScaleName.fahrenheit; 
    } 

    public Temperature(double number) { 
     this.number = number; 
     scale = ScaleName.fahrenheit; 
    } 

    public Temperature(ScaleName scale) { 
     number = 0.0; 
     this.scale = scale; 
    } 

    public Temperature(double number, ScaleName scale) { 
     this.number = number; 
     this.scale = scale; 
    } 

    public void setNumber(double number) { 
     this.number = number; 
    } 

    public double getNumber() { 
     return number; 
    } 

    public void setScale(ScaleName scale) { 
     this.scale = scale; 
    } 

    public ScaleName getScale() { 
     return scale; 
    } 
} 

UseTemperature.java

class Temperature { 

    private double number; 
    private ScaleName scale; 

    public Temperature() { 
     number = 0.0; 
     scale = ScaleName.fahrenheit; 
    } 

    public Temperature(double number) { 
     this.number = number; 
     scale = ScaleName.fahrenheit; 
    } 

    public Temperature(ScaleName scale) { 
     number = 0.0; 
     this.scale = scale; 
    } 

    public Temperature(double number, ScaleName scale) { 
     this.number = number; 
     this.scale = scale; 
    } 

    public void setNumber(double number) { 
     this.number = number; 
    } 

    public double getNumber() { 
     return number; 
    } 

    public void setScale(ScaleName scale) { 
     this.scale = scale; 
    } 

    public ScaleName getScale() { 
     return scale; 
    } 
} 
+0

Vedere anche [* Enum *] (http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html). – trashgod

risposta

20

Perché un enum è dichiarato in un file separato, in Java?

non si devono dichiarare un enum in un file separato. Si potrebbe fare questo:

public class Temperature { 
    public enum ScaleName {celsius, fahrenheit, kelvin, rankine}; 

    private double number; 
    private ScaleName scale; 

    public Temperature() { 
     number = 0.0; 
     scale = ScaleName.fahrenheit; 
    } 
    ... 
} 

L'unica differenza tra questo e rendere l'enum una classe di livello superiore è che è ora necessario qualificare il nome della enum quando lo si utilizza in una classe diversa.

Ma quello che sta succedendo qui non è diverso da ciò che accade se l'enum fosse una classe normale. (E un enum è implicitamente statica, quindi non abbiamo bisogno di una parola chiave static ...)


perché è questo enum dichiarato nel proprio file.

Perché l'autore del codice ha scelto di farlo in questo modo.

C'è un vantaggio?

Sì. Significa che non è necessario qualificare lo enum per utilizzarlo ... in alcune circostanze in cui dovresti farlo se lo enum è stato annidato come sopra.


In realtà, Java non consentono di mettere più classi di primo livello nello stesso file sorgente condizione che tutti, ma una delle classi è "pacchetto privata". Tuttavia, farlo generalmente è considerato cattivo stile e può essere problematico per alcune catene di strumenti ... Ho sentito.

+0

Se si inserisce l'enumerazione nel proprio file, non è necessario avvolgerlo in una classe come sopra. È possibile semplicemente dichiarare l'enumerazione come "public enum ScaleName" direttamente nel file ScaleName.java e quindi non è necessario qualificare il nome. –

+0

Non l'ho già detto? (* "L'unica differenza ...." *) –

3

Un enum è un class e segue stesse regole.

Avere in un proprio file è esattamente come spostare una classe interna in un file separato, niente di più né di meno. Quindi sì, è possibile spostarlo all'interno di una classe ed essere in grado di accedervi dall'esterno con la sintassi OuterClass.ScaleName.

10

Le enumerazioni non sono solo valori nulli in Java, sono molto più di questo. Sono classi a sé stanti (ereditano lo Object). E considerare questi:

public enum Int { 
    ONE(1), 
    TWO(2); 

    private final int value; 

    Int(final int value) { this.value = value; } 

    public int getValue() { return value; } 

    @Override 
    public String toString() { return "I am integer " + value; } 
} 

Considera anche:

public enum Operation 
{ 
    PLUS 
     { 
      @Override 
      public int calculate(final int i1, final int i2) 
      { 
       return i1 + i2; 
      } 
     }; 

    public abstract int calculate(int i1, int i2); 
} 

final int ret = Operation.PLUS.calculate(2, 3); 

E si possono combinare entrambi, anche. Sono strumenti molto potenti.

+0

Sono sicuro che questa è un'ottima risposta, e ha senso, per qualcuno più avanzato di I. Tuttavia il tuo codice è molto più complicato della sintassi che conosco finora. Sto imparando, non un esperto. –

+0

Puoi ugualmente usare semplici enumerazioni: 'public enum Const {VALUE1, VALUE2}'. Ma il fatto è che sono classi (con alcune peculiarità), quindi vengono utilizzati come tali;) – fge