ฉันสามารถตั้งค่าเริ่มต้น enum ใน Java ได้ไหม


194

ฉันใช้ Enum เพื่อสร้างค่าคงที่ไม่กี่:

enum ids {OPEN, CLOSE};

ค่า OPEN เป็นศูนย์ แต่ฉันต้องการให้เป็น 100 เป็นไปได้ไหม


@ScottF คุณต้องการใช้ enums อย่างไร?
Anish B.

ในคำตอบด้านบนมีคำจำกัดความ enum ฉันต้องการตัวอย่างของวิธีการที่ Enum ที่กำหนดไว้จะถูกใช้ในรหัส ตัวอย่างเช่นวิธีการ ctor ที่กำหนดจะใช้ในการสร้างตัวอย่าง enum ด้วยค่าจำนวนเต็มเฉพาะ
ScottF

@ScottF ถ้าฉันเป็นคุณแทนที่จะตั้งค่าความโปรดปรานในโพสต์นี้ฉันอยากจะโพสต์คำถามใหม่อย่างสมบูรณ์ ..... หรืออ่านเอกสารเกี่ยวกับ enums ดูเหมือนว่าคุณจะต้องเข้าใจความรู้หลักบางอย่างเกี่ยวกับมัน;)
lealceldeiro

enum ids {OPEN = 100, CLOSE};?
นายออสการ์

คำตอบ:


307

Java enums ไม่เหมือนกับ C หรือ C ++ enums ซึ่งเป็นเพียงป้ายกำกับสำหรับจำนวนเต็ม

Java enums ถูกนำมาใช้มากขึ้นเช่นคลาส - และพวกเขายังสามารถมีหลายคุณลักษณะ

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

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

ความแตกต่างที่สำคัญคือพวกเขาปลอดภัยประเภทซึ่งหมายความว่าคุณไม่ต้องกังวลกับการกำหนดสี enum ให้กับตัวแปร SIZE

ดูhttp://docs.oracle.com/javase/tutorial/java/javaOO/enum.htmlสำหรับข้อมูลเพิ่มเติม


ตามคำสั่งของคุณวิธีที่ดีที่สุดคือการใช้ java เพื่อสร้าง enum ของจำนวนเต็มเรียงลำดับ (คล้ายกับ C ++ enum) สำหรับดัชนีในอาร์เรย์หรือบางสิ่งบางอย่างเขียน: enum Ids {NAME (0), AGE (1) ) ความสูง (2) น้ำหนัก (3); } ขอบคุณ -bn
bn

อาจเป็นไปได้และโดยเฉพาะอย่างยิ่งถ้าคุณเคยเรียงลำดับค่าที่สำคัญบางแห่ง
lavinio

1
คุณช่วยบอกวิธีใช้ Enum นี้ในฟังก์ชั่นได้ไหม?
บั๊กเกิดขึ้น

2
ขี้เกียจมาตรฐาน Java ไม่อนุญาตให้ตั้งค่าสำหรับ enum อย่างน้อย c # อนุญาตให้ AND นี้เป็นประเภทที่ปลอดภัย
ช่างทำกุญแจ

2
FWIW, C ++ 11 enum classตอนนี้มีชนิดปลอดภัย
ฟีนิกซ์

93

ใช่. คุณสามารถส่งค่าตัวเลขไปยังตัวสร้างสำหรับ enum ดังนี้:

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

  private int value;    

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

  public int getValue() {
    return value;
  }
}

ดูคู่มือภาษาซันชวาสำหรับข้อมูลเพิ่มเติม


เย็น. มันเป็นไปได้ที่จะผสม? คือกำหนดตัวเลขให้กับค่า Enum ที่เลือกเท่านั้น
Frederick Nord


@FrederickNord - แน่นอน เพียงเพิ่มตัวสร้างส่วนตัวที่สองโดยไม่มี args ที่เริ่มต้นvalueเป็นศูนย์ (พูด) จากนั้นรวม (พูด) DANCEในรายการค่า
Stephen C

15

เกี่ยวกับการใช้วิธีนี้:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

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

มีวิธีเดียวเท่านั้น ..

คุณสามารถใช้วิธีการคงที่และผ่าน Enum เป็นพารามิเตอร์เช่น:

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

โปรดทราบว่าทั้งสองวิธีใช้หน่วยความจำน้อยลงและหน่วยประมวลผลเพิ่มเติม .. ฉันไม่ได้บอกว่านี่เป็นวิธีที่ดีที่สุด แต่เป็นเพียงแนวทางอื่น


1
เหตุใดจึงgetColorValue()ซิงโครไนซ์ในตัวอย่างที่สอง
josaphatv

@josaphatv ฟังก์ชั่นทั้งหมดในตัวอย่างที่สองเป็นแบบคงที่มันไม่เคยเปลี่ยนแปลง คุณอาจต้องการHL_COLORS.getColorValue(HL_COLORS.YELLOW);โดยไม่เริ่มต้น enum
mazunki

11

หากคุณใช้ประเภท enum ขนาดใหญ่มากการติดตามจะมีประโยชน์

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

หากคุณต้องการเลียนแบบ enum ของ C / C ++ (ฐาน num และ 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

ฟังก์ชันเลขลำดับ () จะคืนค่าตำแหน่งสัมพัทธ์ของตัวระบุใน enum คุณสามารถใช้สิ่งนี้เพื่อรับการจัดทำดัชนีอัตโนมัติด้วยออฟเซ็ตเช่นเดียวกับ enum สไตล์ 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);
    }
};

ให้ผลลัพธ์:

OPEN:  100
CLOSE: 101
OTHER: 102

แก้ไข: เพิ่งรู้ว่านี่คล้ายกับคำตอบของ ggrandesมาก แต่ฉันจะทิ้งไว้ที่นี่เพราะมันสะอาดมากและใกล้ที่สุดเท่าที่คุณจะไปถึงสไตล์ C enum


ในตัวอย่างคุณใช้ enum และรับ int คุณสามารถแสดงย้อนกลับใช้ int และจบลงด้วยการ enum (โดยไม่ต้องเป็นกรณีที่สวิทช์ที่ชัดเจนสำหรับแต่ละค่า?)
ScottF

ตามคำถามฉันเชื่อว่านี่เป็นคำตอบที่เหมาะสมที่สุด ที่นี่เราได้เปลี่ยนดัชนีเริ่มต้นของ enum ให้เริ่มจาก 100 โดยไม่ต้องกำหนดตัวแปรใหม่และกำหนดค่าเหล่านี้ผ่าน Constructor
ราหุลเชน

@RahulJain ฉันอยากจะใช้คำตอบที่ได้รับการยอมรับ ดูเหมือนว่าจะสะอาดกว่าสำหรับฉัน
lealceldeiro

1

@scottf

Enum เป็นเหมือนซิงเกิล JVM สร้างอินสแตนซ์

หากคุณจะสร้างมันด้วยตัวเองด้วยชั้นเรียนอาจเป็นเช่นนั้น

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 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 คุณอาจสับสนเนื่องจากตัวสร้างที่กำหนดใน ENUM

ฉันขออธิบายว่า

เมื่อclass loaderโหลดenumคลาสแล้วตัวenumสร้างที่เรียกว่า เกี่ยวกับอะไร !! ใช่มันเรียกว่าบนและOPEN closeมีค่า100สำหรับอะไรOPENและ200สำหรับclose

ฉันมีค่าต่างกันได้ไหม

ใช่,

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

แต่มันเป็นการปฏิบัติที่ไม่ดี enumถูกนำมาใช้สำหรับการเป็นตัวแทนconstantsเช่นdays of week, colors in rainbowคือกลุ่มเล็ก ๆ เช่นของค่าคงที่ที่กำหนดไว้ล่วงหน้า


0

ฉันคิดว่าคุณสับสนจากการดูตัวแจงนับ C ++ ตัวแจงนับ Java แตกต่างกัน

นี่จะเป็นรหัสถ้าคุณคุ้นเคยกับการแปลภาษา 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);
}
};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.