Có thể gán giá trị số cho enum trong Java không?


132

Có bất cứ điều gì như thế này có thể có trong Java không? Người ta có thể gán các giá trị số tùy chỉnh cho các phần tử enum trong Java không?

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

Không trực tiếp như bạn đã viết, tức là, trong đó một 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.
Hovercraft Full Of Eels


@Benoit Tôi không nghĩ đó là một bản dupe: rằng người ta chỉ thiết lập giá trị đầu tiên và tăng dầ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.
Ciro Santilli 郝海东 冠状 病 事件

Câu trả lời:


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

    private int numVal;

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

    public int getNumVal() {
        return numVal;
    }
}

11
Bạn không thể sử dụng hàm tạo enum trong mã. EXIT_CODE.AEXIT_CODE.Blà những trường hợp duy nhất sẽ tồn tại.
Bhesh Gurung

2
@IgorGanapolsky nói riêng, các nhà xây dựng của một enum không thể được công khai: stackoverflow.com/questions/3664077/...
Ciro Santilli郝海东冠状病六四事件法轮功

điều này sẽ vẫn hoạt động với gson và chuyển đổi từ json.
Zapnologica

4
Bạn cũng có thể khai báo biến "chung kết int numVal" và chỉ cần truy cập trực tiếp vào biến đó là EXIT_CODE.A.numVal (tôi thích tên 'value') mà không cần phương thức truy cập. Vì nó là cuối cùng, nó chỉ có thể được đặt trong hàm tạo. IMO nó dẫn đến mã sạch hơn một chút, nhưng tôi cho rằng đó chủ yếu là vấn đề ưu tiên. Sử dụng một biến cuối cùng giúp bạn tiết kiệm một định nghĩa phương thức.
Steve Ferguson

34

, và sau đó một số, 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));
    }
}

Tại sao công khai static void void (String [] args) bên trong enum ??
IgorGanapolsky

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

2
@IgorGanapolsky: bởi vì đó là cách đó trong các tài liệu chính thức (theo Yes -link)
serv-inc

@ user1587329 Thú vị, tôi đoán đó chỉ dành cho mục đích thử nghiệm. Tôi không thấy cách sử dụng mã đó trong mã phát hành sản xuất ...
IgorGanapolsky

12

Giả sử EXIT_CODE đang đề cập đến System . exit(exit_code) thì 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 những điều sau đây tại các điểm thích hợp trong mã của bạn

ExitCode . NORMAL_SHUTDOWN . exit ( ) '


3

Mở rộng câu trả lời của Bhesh Gurung để gán giá trị, bạn có thể thêm phương thức tường minh để đặt 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ừ ứng dụng gọi điện

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

// Bạn đã enum hợp lệ từ bây giờ

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


2

Nếu bạn đang tìm cách để nhóm các hằng số trong một lớp, bạn có thể sử dụng một lớp bên trong tĩnh:

public class OuterClass {
    public void exit(boolean isTrue){
        if(isTrue){
            System.exit(ExitCode.A);
        }else{
            System.exit(ExitCode.B);
        }
    }
    public static class ExitCode{
        public static final int A = 203;
        public static final int B = 204;
    }   
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.