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;
}
James Raitsev
sumber
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
kemungkinan duplikat dari dapat menetapkan nilai awal enum di java
Ben S
@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;
    }
}
Bhesh Gurung
sumber
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));
    }
}
Ben S
sumber
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 ( ) '

emory
sumber
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]

Sudhakar
sumber
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;
    }   
}
Rigo Brinkman
sumber