Apakah mungkin untuk menetapkan nilai numerik ke enum di Jawa?


132

Apakah hal seperti ini dimungkinkan di Jawa? Bisakah satu menetapkan nilai numerik khusus untuk elemen enum di Jawa?

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

Tidak secara langsung seperti yang Anda tulis, yaitu, di mana nilai enum sama dengan angka, tetapi ya secara tidak langsung seperti yang ditunjukkan pada tautan Ben S.
Hovercraft Full Of Belut


@Benoit Saya tidak berpikir Ini adalah penipuan: yang satu adalah tentang pengaturan hanya nilai pertama dan kenaikan dari sana, ini tentang pengaturan semua nilai. Tapi pasti terkait.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:


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
Anda tidak dapat menggunakan enum constructor dalam kode. EXIT_CODE.Adan EXIT_CODE.Bmerupakan satu-satunya contoh yang pernah ada.
Bhesh Gurung

2
@IgorGanapolsky khususnya, konstruktor dari enum tidak bisa publik: stackoverflow.com/questions/3664077/...
Ciro Santilli郝海东冠状病六四事件法轮功

apakah ini masih bekerja dengan gson dan mengkonversi dari json.
Zapnologica

4
Anda juga dapat mendeklarasikan variabel "public final int numVal" dan cukup mengaksesnya secara langsung sebagai EXIT_CODE.A.numVal (Saya lebih suka nama 'nilai'), tanpa perlu metode accessor. Karena sudah final, itu hanya dapat diatur dalam konstruktor. IMO itu mengarah ke kode yang sedikit lebih bersih, tetapi sebagian besar masalah preferensi, saya kira. Menggunakan variabel akhir menghemat satu definisi metode.
Steve Ferguson

34

Ya , dan kemudian beberapa, contoh dari dokumentasi:

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

Mengapa public void main (String [] args) publik Anda berada di dalam enum itu sendiri ??
IgorGanapolsky

3
@IgorGanapolsky Untuk membuat contoh mandiri saya kira!
mat_boy

2
@IgorGanapolsky: karena memang seperti itu dalam dokumen resmi (ikuti tautan- Ya )
serv-inc

@ user1587329 Menarik, saya kira itu hanya untuk tujuan pengujian. Saya tidak melihat cara untuk menggunakannya dalam kode rilis produksi ...
IgorGanapolsky

12

Dengan asumsi EXIT_CODE merujuk System . exit(exit_code) maka Anda bisa melakukannya

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

Kemudian Anda dapat menempatkan yang berikut ini di tempat-tempat yang sesuai dalam kode Anda

ExitCode . NORMAL_SHUTDOWN . exit ( ) '


3

Memperluas jawaban Bhesh Gurung untuk menetapkan nilai, Anda dapat menambahkan metode eksplisit untuk menetapkan nilai

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

Dari memanggil aplikasi

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

// Anda sudah valid enum dari sekarang

[Tidak dapat mengomentari jawabannya, maka mempostingnya secara terpisah]


2

Jika Anda mencari cara untuk mengelompokkan konstanta di kelas, Anda bisa menggunakan kelas dalam statis:

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;
    }   
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.