Tôi có thể đặt giá trị bắt đầu enum trong Java không?


194

Tôi sử dụng enum để tạo một vài hằng số:

enum ids {OPEN, CLOSE};

giá trị MỞ bằng 0, nhưng tôi muốn nó là 100. Có thể không?


@ScottF Bạn có muốn sử dụng enums không?
Anish B.

Trong câu trả lời hàng đầu, có một định nghĩa enum. Tôi muốn một ví dụ về cách enum được xác định sẽ được sử dụng trong mã. Ví dụ, làm thế nào ctor được xác định sẽ được sử dụng để tạo một thể hiện enum với một giá trị số nguyên cụ thể.
ScottF

@ScottF nếu tôi là bạn, thay vì đặt tiền thưởng cho bài đăng này, tôi muốn đăng một câu hỏi hoàn toàn mới ..... hoặc, đọc tài liệu về enums. Có vẻ như bạn cần phải nắm được một số kiến ​​thức cốt lõi về nó;)
lealceldeiro

enum ids {OPEN = 100, CLOSE};?
Ông Oscar

Câu trả lời:


307

Các enum Java không giống như các enum C hoặc C ++, mà thực sự chỉ là các nhãn cho các số nguyên.

Các enum Java được triển khai giống như các lớp hơn - và chúng thậm chí có thể có nhiều thuộc tính.

public enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

Sự khác biệt lớn là chúng là loại an toàn , điều đó có nghĩa là bạn không phải lo lắng về việc gán enum MÀU cho biến SIZE.

Xem http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html để biết thêm.


Dựa trên tuyên bố của bạn, cách tốt nhất là sử dụng java để tạo ra một số nguyên liên tiếp (tương tự như enum C ++), cho một chỉ mục thành một mảng hoặc một cái gì đó, hãy viết: enum Ids {NAME (0), AGE (1 ), CHIỀU CAO (2), TRỌNG LƯỢNG (3); } Cảm ơn bạn, -bn
bn.

Có thể, và đặc biệt nếu bạn từng tuần tự hóa các giá trị tích phân ở đâu đó.
lavinio

1
Bạn có thể vui lòng cho biết làm thế nào để sử dụng enum này trong một chức năng?
Lỗi xảy ra vào

2
Các tiêu chuẩn Java không cho phép đặt giá trị cho enum. Ít nhất c # cho phép AND này là loại an toàn.
thợ rèn

2
FWIW, C ++ 11 hiện có loại an toàn enum class.
phượng hoàng

92

Đúng. Bạn có thể truyền các giá trị số cho hàm tạo cho enum, như vậy:

enum Ids {
  OPEN(100),
  CLOSE(200);

  private int value;    

  private Ids(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }
}

Xem Hướng dẫn ngôn ngữ Sun Java để biết thêm thông tin.


Mát mẻ. Có thể trộn? Tức là chỉ gán số cho các giá trị Enum đã chọn.
Frederick Nord

công cụ sửa đổi riêng là dự phòng cho các nhà xây dựng enum
Nino van Hooff

@FrederickNord - Chắc chắn rồi. Chỉ cần thêm một hàm tạo riêng thứ hai không có đối số khởi tạo valuethành số không (nói). Sau đó bao gồm (nói) DANCEtrong danh sách các giá trị.
Stephen C

15

những gì về cách sử dụng theo cách này:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public int getColorValue() {
              switch (this) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }
}

chỉ có một phương pháp ..

bạn có thể sử dụng phương thức tĩnh và truyền Enum làm tham số như:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public static int getColorValue(HL_COLORS hl) {
              switch (hl) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }

Lưu ý rằng hai cách này sử dụng ít bộ nhớ hơn và nhiều đơn vị xử lý hơn .. Tôi không nói đây là cách tốt nhất nhưng nó chỉ là một cách tiếp cận khác.


1
Tại sao được getColorValue()đồng bộ hóa trong ví dụ thứ hai?
josaphatv

@josaphatv Tất cả các chức năng trong ví dụ thứ hai là tĩnh, nó không bao giờ thay đổi. Bạn có thể muốn HL_COLORS.getColorValue(HL_COLORS.YELLOW);mà không khởi tạo enum.
mazunki

11

Nếu bạn sử dụng các loại enum rất lớn sau đó, sau đây có thể hữu ích;

public enum deneme {

    UPDATE, UPDATE_FAILED;

    private static Map<Integer, deneme> ss = new TreeMap<Integer,deneme>();
    private static final int START_VALUE = 100;
    private int value;

    static {
        for(int i=0;i<values().length;i++)
        {
            values()[i].value = START_VALUE + i;
            ss.put(values()[i].value, values()[i]);
        }
    }

    public static deneme fromInt(int i) {
        return ss.get(i);
    }

    public int value() {
    return value;
    }
}

7

Nếu bạn muốn mô phỏng enum của C / C ++ (số gia cơ bản và số nexts):

enum ids {
    OPEN, CLOSE;
    //
    private static final int BASE_ORDINAL = 100;
    public int getCode() {
        return ordinal() + BASE_ORDINAL;
    }
};

public class TestEnum {
    public static void main (String... args){
        for (ids i : new ids[] { ids.OPEN, ids.CLOSE }) {
            System.out.println(i.toString() + " " + 
                i.ordinal() + " " + 
                i.getCode());
        }
    }
}
OPEN 0 100
CLOSE 1 101

4

Hàm ordinal () trả về vị trí tương đối của mã định danh trong enum. Bạn có thể sử dụng điều này để có được lập chỉ mục tự động với phần bù, như với enum kiểu C.

Thí dụ:

public class TestEnum {
    enum ids {
        OPEN,
        CLOSE,
        OTHER;

        public final int value = 100 + ordinal();
    };

    public static void main(String arg[]) {
        System.out.println("OPEN:  " + ids.OPEN.value);
        System.out.println("CLOSE: " + ids.CLOSE.value);
        System.out.println("OTHER: " + ids.OTHER.value);
    }
};

Cung cấp đầu ra:

OPEN:  100
CLOSE: 101
OTHER: 102

Chỉnh sửa: chỉ nhận ra điều này rất giống với câu trả lời của ggrandes , nhưng tôi sẽ để nó ở đây vì nó rất sạch sẽ và gần đến mức bạn có thể đến với enum kiểu C.


Trong ví dụ này, bạn lấy một enum và nhận một int. Bạn có thể hiển thị ngược lại, lấy một số nguyên và kết thúc bằng một enum (không có trường hợp chuyển đổi rõ ràng cho mỗi giá trị không?)
ScottF

Theo câu hỏi, tôi tin rằng đây là câu trả lời phù hợp nhất. Ở đây chúng tôi đã thay đổi chỉ số enum mặc định để bắt đầu từ 100 mà không xác định biến mới và gán chúng thông qua hàm tạo.
Rahul Jain

@RahulJain Tôi thà sử dụng câu trả lời được chấp nhận. Nó có vẻ sạch hơn với tôi.
lealceldeiro

1

@scottf

Một enum giống như một Singleton. JVM tạo cá thể.

Nếu bạn tự tạo nó với các lớp, nó có thể trông như thế

public static class MyEnum {

    final public static MyEnum ONE;
    final public static MyEnum TWO;

    static {
        ONE = new MyEnum("1");
        TWO = new MyEnum("2");
    }

    final String enumValue;

    private MyEnum(String value){
        enumValue = value;    
    }

    @Override
    public String toString(){
        return enumValue;
    }


}

Và có thể được sử dụng như thế:

public class HelloWorld{

   public static class MyEnum {

       final public static MyEnum ONE;
       final public static MyEnum TWO;

       static {
          ONE = new MyEnum("1");
          TWO = new MyEnum("2");
       }

       final String enumValue;

       private MyEnum(String value){
           enumValue = value;    
       }

       @Override
       public String toString(){
           return enumValue;
       }


   }

    public static void main(String []args){

       System.out.println(MyEnum.ONE);
       System.out.println(MyEnum.TWO);

       System.out.println(MyEnum.ONE == MyEnum.ONE);

       System.out.println("Hello World");
    }
}

0
 public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     System.out.println(id1.getValue());
    }
}

enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

@scottf, Có lẽ bạn nhầm lẫn vì hàm tạo được xác định trong ENUM.

Hãy để tôi giải thích điều đó.

Khi class loadertải enumlớp, thì enumconstructor cũng được gọi. Về những gì!! Vâng, nó được gọi là OPENclose. Với những giá trị nào 100cho OPEN200choclose

Tôi có thể có giá trị khác nhau?

Đúng,

public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     id1.setValue(2);
     System.out.println(id1.getValue());
    }
}

enum Ids {
    OPEN(100), CLOSE(200);

    private int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
    public void setValue(int value) { id = value; }
}

Nhưng, đó là thực tế xấu. enumđược sử dụng để biểu diễn constantslike days of week, colors in rainbowtức là nhóm nhỏ các hằng số được xác định trước như vậy.


0

Tôi nghĩ rằng bạn đang bối rối khi nhìn vào các điều tra viên C ++. Điều tra viên Java là khác nhau.

Đây sẽ là mã nếu bạn đã quen với enum C / C ++:

public class TestEnum {
enum ids {
    OPEN,
    CLOSE,
    OTHER;

    public final int value = 100 + ordinal();
};

public static void main(String arg[]) {
    System.out.println("OPEN:  " + ids.OPEN.value);
    System.out.println("CLOSE: " + ids.CLOSE.value);
    System.out.println("OTHER: " + ids.OTHER.value);
}
};
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.