เป็นไปได้หรือไม่ที่จะกำหนดค่าตัวเลขให้กับ enum ใน Java?


132

สิ่งนี้เป็นไปได้ใน Java หรือไม่? สามารถกำหนดค่าตัวเลขที่กำหนดเองให้กับองค์ประกอบ enum ใน Java ได้หรือไม่?

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

ไม่ใช่โดยตรงตามที่คุณเขียนกล่าวคือโดยที่ค่า enum เท่ากับตัวเลข แต่ใช่โดยอ้อมตามที่แสดงในลิงค์ของ Ben S
Hovercraft Full Of Eels

สามารถทำซ้ำได้ของcan set enum start value ใน java
Ben S

@Benoit ฉันไม่คิดว่ามันเป็นการหลอกลวง: อันนั้นเกี่ยวกับการตั้งค่าเพียงค่าแรกและเพิ่มขึ้นจากที่นั่นนี่คือการตั้งค่าทั้งหมด แต่เกี่ยวข้องกันแน่นอน.
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


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
คุณไม่สามารถใช้ enum constructor ในโค้ดได้ EXIT_CODE.AและEXIT_CODE.Bเป็นเพียงอินสแตนซ์เดียวที่จะมีอยู่
Bhesh Gurung

2
โดยเฉพาะอย่างยิ่ง @IgorGanapolsky ผู้สร้าง enum ไม่สามารถเผยแพร่สู่สาธารณะได้: stackoverflow.com/questions/3664077/…
Ciro Santilli 郝海东冠状病六四事件法轮功

สิ่งนี้จะยังคงใช้ได้กับ gson และการแปลงจาก json หรือไม่
Zapnologica

4
นอกจากนี้คุณยังสามารถประกาศตัวแปร "public final int numVal" และเข้าถึงโดยตรงในชื่อ EXIT_CODE.A.numVal (ฉันชอบชื่อ 'value') โดยไม่ต้องใช้วิธีการเข้าถึง เนื่องจากเป็นขั้นสุดท้ายจึงสามารถตั้งค่าได้ในตัวสร้างเท่านั้น IMO นำไปสู่รหัสที่สะอาดกว่าเล็กน้อย แต่ส่วนใหญ่เป็นเรื่องของความชอบฉันคิดว่า การใช้ตัวแปรสุดท้ายช่วยให้คุณประหยัดคำจำกัดความวิธีการหนึ่ง
Steve Ferguson

34

ใช่แล้วบางตัวอย่างจากเอกสารประกอบ:

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

เหตุใด public static void main (String [] args) ของคุณจึงอยู่ภายใน enum เอง ??
IgorGanapolsky

3
@IgorGanapolsky เพื่อให้ตัวอย่างมีตัวตนฉันเดา!
mat_boy

2
@IgorGanapolsky: เพราะเป็นแบบนั้นในเอกสารอย่างเป็นทางการ (ทำตามลิงก์ใช่ )
บริการ - inc

@ user1587329 น่าสนใจฉันเดาว่ามีไว้เพื่อการทดสอบเท่านั้น ฉันไม่เห็นวิธีที่จะใช้ในรหัสรุ่นที่ใช้งานจริง ...
IgorGanapolsky

12

สมมติว่า EXIT_CODE อ้างถึงSystem . exit(exit_code) คุณสามารถทำได้

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

จากนั้นคุณสามารถวางสิ่งต่อไปนี้ในจุดที่เหมาะสมในรหัสของคุณ

ExitCode . NORMAL_SHUTDOWN . exit ( ) '


3

การขยายคำตอบของ Bhesh Gurung สำหรับการกำหนดค่าคุณสามารถเพิ่มวิธีการที่ชัดเจนเพื่อกำหนดค่าได้

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

จากแอพพลิเคชั่นโทร

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

// คุณมี enum ที่ถูกต้องนับจากนี้

[ไม่สามารถแสดงความคิดเห็นกับคำตอบของเขาได้จึงโพสต์แยกต่างหาก]


2

หากคุณกำลังมองหาวิธีจัดกลุ่มค่าคงที่ในคลาสคุณสามารถใช้คลาสภายในแบบคงที่:

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