2013-01-21 39 views
13

Tại sao enum này được khai báo trong tệp riêng của nó. Có một lợi thế cho điều này? Ngoài ra làm thế nào tôi sẽ có thể đặt này ở một trong 2 tập tin. Tôi thực sự không biết tôi đang làm gì. Cũng xin giải thích điều này một cách đơn giản, vì đây là một ví dụ về sách giáo khoa và tôi khá mới với Java.Tại sao một enum được khai báo trong một tệp riêng biệt, trong 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

Xem thêm [* Enums *] (http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html). – trashgod

Trả lời

20

Tại sao một enum được khai báo trong một tệp riêng biệt, trong Java?

Bạn không phải khai báo enum trong một tệp riêng biệt. Bạn có thể làm điều này:

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

    private double number; 
    private ScaleName scale; 

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

Sự khác biệt duy nhất giữa này và làm cho enum một lớp cấp cao nhất là bây giờ bạn cần phải hội đủ điều kiện tên của enum khi bạn sử dụng nó trong một lớp học khác nhau.

Nhưng những gì đang xảy ra ở đây là không có gì khác với những gì xảy ra nếu enum là một lớp thông thường. (Và một enum là ngầm tĩnh, vì vậy chúng ta không cần một từ khóa static ...)


Tại sao enum này khai báo trong tập tin riêng của mình.

Vì tác giả mã đã chọn thực hiện theo cách này.

Có lợi thế cho điều này không?

Có. Điều đó có nghĩa là bạn không cần phải đủ điều kiện để sử dụng số điện thoại enum ... trong một số trường hợp mà bạn sẽ phải thực hiện nếu số enum được lồng vào như trên.


Trên thực tế, Java không cho phép bạn đặt nhiều lớp đầu cấp vào cùng một tập tin nguồn với điều kiện tất cả nhưng một trong những lớp học là "gói tin". Tuy nhiên, làm điều đó thường được cho là phong cách xấu, và nó có thể là vấn đề đối với một số dây chuyền công cụ ... Tôi đã nghe.

+0

Nếu bạn đặt liệt kê trong tập tin riêng của nó, bạn không cần phải bọc nó trong một lớp như trên. Bạn có thể chỉ cần khai báo liệt kê là "public enum ScaleName" ngay bên trong tệp ScaleName.java, và sau đó bạn không cần phải đủ điều kiện tên. –

+0

Chẳng phải tôi đã nói thế sao? (*"Sự khác biệt duy nhất ...."*) –

3

Một enum là một class và sau quy định tương tự.

Làm cho nó trên tệp riêng của nó giống hệt như di chuyển một lớp bên trong trong một tệp riêng biệt, không có gì nhiều hơn hoặc ít hơn. Vì vậy, có bạn có thể di chuyển nó bên trong một trong các lớp học và có thể truy cập nó từ bên ngoài với cú pháp OuterClass.ScaleName.

10

Enums không chỉ là giá trị trần trong Java, chúng còn hơn thế nữa. Họ là những lớp học theo đúng nghĩa của họ (họ kế thừa Object). Và xem xét sau đây:

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

cũng xem xét:

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

và bạn có thể kết hợp cả hai, quá. Chúng là những công cụ rất mạnh.

+0

Tôi chắc chắn rằng đây là một câu trả lời tuyệt vời, và có ý nghĩa, với ai đó tiên tiến hơn sau đó I. Tuy nhiên mã của bạn phức tạp hơn nhiều so với cú pháp mà tôi biết cho đến nay. Tôi đang học, không phải là một chuyên gia. –

+0

Bạn cũng có thể sử dụng các enums đơn giản: 'public enum Const {VALUE1, VALUE2}'. Nhưng vấn đề là, chúng là các lớp (với một số phân tử), vì vậy chúng được sử dụng như vậy;) – fge

Các vấn đề liên quan