Java'da bir numaralandırmaya sayısal değer atamak mümkün müdür?


132

Java'da böyle bir şey mümkün mü? Java'da öğeleri numaralandırmak için özel sayısal değerler atanabilir mi?

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

Doğrudan yazdığınız gibi değil, yani bir sıralama değerinin bir sayıya eşit olduğu yerde , ancak Ben S'nin bağlantısında gösterildiği gibi dolaylı olarak evet.
Hovercraft Full Of Eels


@Benoit Bunun bir dupe olduğunu düşünmüyorum: bu sadece ilk değeri ayarlamak ve oradan artırmakla ilgili, bu tüm değerleri ayarlamakla ilgili. Ama kesinlikle ilgili.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Yanıtlar:


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
Kodda enum yapıcısını kullanamazsınız. EXIT_CODE.Ave EXIT_CODE.Bvar olacak tek örneklerdir.
Bhesh Gurung

2
Özellikle @IgorGanapolsky, bir numaralandırmanın kurucusu herkese açık olamaz: stackoverflow.com/questions/3664077/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

bu yine de gson ile çalışacak ve json'dan dönüştürülecek.
Zapnologica

4
Ayrıca, "public final int numVal" değişkenini de bildirebilir ve bir erişimci yöntemine ihtiyaç duymadan doğrudan EXIT_CODE.A.numVal ('değer' adını tercih ederim) olarak erişebilirsiniz. Nihai olduğu için, yalnızca yapıcıda ayarlanabilir. IMO biraz daha temiz koda yol açar, ancak bu çoğunlukla bir tercih meselesidir, sanırım. Son bir değişken kullanmak size bir yöntem tanımı kazandırır.
Steve Ferguson

34

Evet ve sonra bazı belgeler, örneğin:

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) neden numaralamanın kendisinin içinde?
IgorGanapolsky

3
@IgorGanapolsky Örneği kendi kendine yeten yapmak için sanırım!
mat_boy

2
@IgorGanapolsky: çünkü resmi belgelerde bu şekilde ( Evet bağlantısını takip edin )
serv-inc

@ user1587329 İlginç, sanırım bu sadece test amaçlı. Bunu üretim sürüm kodunda kullanmanın bir yolunu görmüyorum ...
IgorGanapolsky

12

EXIT_CODE öğesinin System . exit(exit_code) 'a atıfta bulunduğunu varsayarsak,

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

Daha sonra aşağıdakileri kodunuzda uygun noktalara yerleştirebilirsiniz

ExitCode . NORMAL_SHUTDOWN . exit ( ) '


3

Bhesh Gurung'un değer atama cevabını genişleterek, değeri ayarlamak için açık yöntem ekleyebilirsiniz.

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

Uygulamayı çağırmaktan

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

// Şu andan itibaren geçerli numaralandırmanız var

[Cevabına yorum yapamadığından ayrı olarak yayınlayamaz]


2

Bir sınıftaki sabitleri gruplamanın bir yolunu arıyorsanız, statik bir iç sınıf kullanabilirsiniz:

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;
    }   
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.