2012-01-10 22 views
84

Có điều gì giống như điều này có thể xảy ra trong Java không? Có thể gán một giá trị số tùy chỉnh cho các phần tử enum trong Java không?Có thể gán giá trị số cho một enum trong Java không?

public enum EXIT_CODE { 
    A=104, B=203; 
} 
+0

Không trực tiếp như bạn đã viết, nghĩa là, trong đó giá trị enum * bằng * một số, nhưng có gián tiếp như được hiển thị trong liên kết của Ben S. –

+0

có thể trùng lặp của [có thể đặt giá trị khởi động enum trong java] (http://stackoverflow.com/questions/1067352/can-set-enum-start-value-in-java) –

+0

@Benoit Tôi không nghĩ rằng đó là một dupe: đó là về việc thiết lập chỉ là giá trị đầu tiên và tăng lên từ đó, đây là về việc thiết lập tất cả các giá trị. Nhưng chắc chắn có liên quan. –

Trả lời

141
public enum EXIT_CODE { 
    A(104), B(203); 

    private int numVal; 

    EXIT_CODE(int numVal) { 
     this.numVal = numVal; 
    } 

    public int getNumVal() { 
     return numVal; 
    } 
} 
+4

Vậy làm thế nào bạn sẽ sử dụng hàm tạo này trong mã? –

+5

Bạn không thể sử dụng hàm tạo enum trong mã. 'EXIT_CODE.A' và' EXIT_CODE.B' là các cá thể duy nhất tồn tại. –

+1

@IgorGanapolsky nói riêng, hàm tạo của một enum không thể công khai: http://stackoverflow.com/questions/3664077/why-cant-enum-constructors-be-protected-or-public-in-java –

28

Yes, và sau đó một số người, ví dụ từ tài liệu:

public enum Planet { 
    MERCURY (3.303e+23, 2.4397e6), 
    VENUS (4.869e+24, 6.0518e6), 
    EARTH (5.976e+24, 6.37814e6), 
    MARS (6.421e+23, 3.3972e6), 
    JUPITER (1.9e+27, 7.1492e7), 
    SATURN (5.688e+26, 6.0268e7), 
    URANUS (8.686e+25, 2.5559e7), 
    NEPTUNE (1.024e+26, 2.4746e7); 

    // in kilograms 
    private final double mass; 
    // in meters 
    private final double radius; 
    Planet(double mass, double radius) { 
     this.mass = mass; 
     this.radius = radius; 
    } 
    private double mass() { return mass; } 
    private double radius() { return radius; } 

    // universal gravitational 
    // constant (m3 kg-1 s-2) 
    public static final double G = 6.67300E-11; 

    double surfaceGravity() { 
     return G * mass/(radius * radius); 
    } 
    double surfaceWeight(double otherMass) { 
     return otherMass * surfaceGravity(); 
    } 
    public static void main(String[] args) { 
     if (args.length != 1) { 
      System.err.println("Usage: java Planet <earth_weight>"); 
      System.exit(-1); 
     } 
     double earthWeight = Double.parseDouble(args[0]); 
     double mass = earthWeight/EARTH.surfaceGravity(); 
     for (Planet p : Planet.values()) 
      System.out.printf("Your weight on %s is %f%n", 
          p, p.surfaceWeight(mass)); 
    } 
} 
+0

Tại sao chính công cộng của bạn void trống chính (String [] args) bên trong của enum chính nó ?? –

+3

@IgorGanapolsky Để làm ví dụ khép kín tôi đoán! –

+2

@IgorGanapolsky: bởi vì nó là như vậy trong tài liệu chính thức (theo ** Có ** - liên kết) –

10

Giả sử EXIT_CODE mà là đề cập đến System . exit (exit_code) sau đó bạn có thể làm

enum ExitCode 
{ 
     NORMAL_SHUTDOWN (0) , EMERGENCY_SHUTDOWN (10) , OUT_OF_MEMORY (20) , WHATEVER (30) ; 

     private int value ; 

     ExitCode (int value) 
     { 
      this . value = value ; 
     } 

     public void exit () 
     { 
      System . exit (value) ; 
     } 
} 

Sau đó, bạn có thể đặt thông tin sau vào các vị trí thích hợp trong mã của bạn

ExitCode . NORMAL_SHUTDOWN . exit () '

+39

Đó chắc chắn là một số định dạng mã thú vị ... – PureSpider

1

Mở rộng câu trả lời Bhesh Gurung cho gán giá trị, bạn có thể thêm phương pháp rõ ràng để thiết lập giá trị

public ExitCode setValue(int value){ 
     // A(104), B(203); 
     switch(value){ 
     case 104: return ExitCode.A; 
     case 203: return ExitCode.B; 
     default: 
        return ExitCode.Unknown //Keep an default or error enum handy 
     } 
    } 

Từ gọi ứng dụng

int i = 104; 
ExitCode serverExitCode = ExitCode.setValue(i); 

// Bạn đã enum hợp lệ từ nay

[Không thể nhận xét câu trả lời của anh ấy, do đó đăng riêng nó]

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