2013-01-21 11 views
13

Dlaczego enum jest zadeklarowane we własnym pliku. Czy ma to jakąś zaletę? Również, w jaki sposób byłbym w stanie umieścić to w jednym z 2 plików. Naprawdę nie mam pojęcia, co robię. Wyjaśnij to również w prosty sposób, ponieważ jest to podręcznikowy przykład i jestem całkiem nowym użytkownikiem Javy.Dlaczego enum jest zadeklarowane w osobnym pliku, w Javie?

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

Zobacz także [* Enums *] (http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html). – trashgod

Odpowiedz

20

Dlaczego enum jest zadeklarowane w oddzielnym pliku, w Javie?

Robisz nie trzeba zadeklarować enum w oddzielnym pliku. Można to zrobić:

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

    private double number; 
    private ScaleName scale; 

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

Jedyną różnicą między tym i czyniąc enum najwyższej klasy poziom jest to, że teraz trzeba zakwalifikować nazwa wyliczenia kiedy używasz go w innej klasie.

Ale to, co się tutaj dzieje, nie różni się od tego, co się dzieje, jeśli wyliczenie było regularną klasą. (I enum jest domyślnie statyczne, więc nie musimy się static słowa kluczowego ...)


Dlaczego to enum zadeklarowane w oddzielnym pliku.

Ponieważ autor kodu wybrał to w ten sposób.

Czy jest to korzystne?

Tak. Oznacza to, że nie trzeba kwalifikować enum, aby go użyć ... w pewnych okolicznościach, w których musiałbyś, gdyby enum został zagnieżdżony jak powyżej.


Właściwie Java nie pozwala umieścić wiele klas na najwyższym poziomie do tego samego pliku źródłowego pod warunkiem, że wszystkich, ale jedna z klas jest „pakiet prywatna”. Jednak generalnie uważa się, że jest to zły styl i może być problematyczne dla niektórych łańcuchów narzędzi ... Słyszałem.

+0

Jeśli umieszczasz wyliczenie we własnym pliku, nie musisz owijać go w klasę jak wyżej. Możesz po prostu zadeklarować wyliczenie jako "public enum ScaleName" bezpośrednio w pliku ScaleName.java, a następnie nie musisz kwalifikować nazwy. –

+0

Czy już tego nie powiedziałem? (*"Jedyna różnica ...."*) –

3

enum jest class i podąża same regulacje.

Posiadanie go we własnym pliku jest dokładnie takie, jak przenoszenie klasy wewnętrznej w oddzielnym pliku, nic więcej, ani mniej. Tak więc możesz przenieść go wewnątrz jednej z klas i mieć do niego dostęp z zewnątrz, używając składni OuterClass.ScaleName.

10

Wyliczenia nie są jedynie wartościami pustymi w Javie, są czymś znacznie więcej. Są to klasy same w sobie (dziedziczą Object). I rozważyć te:

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; } 
} 

Rozważmy również:

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); 

i można je połączyć oba, zbyt. Są bardzo potężnymi narzędziami.

+0

Jestem pewien, że jest to świetna odpowiedź i ma sens dla kogoś bardziej zaawansowanego niż ja. Jednak twój kod jest znacznie bardziej skomplikowany niż składnia, którą znam do tej pory. Uczę się, nie jestem ekspertem. –

+0

Możesz również użyć prostych wyrażeń: 'public enum Const {VALUE1, VALUE2}'. Ale chodzi o to, że są to klasy (z pewnymi osobliwościami), więc są one używane jako takie;) – fge

Powiązane problemy