Java'da enum başlangıç ​​değerini ayarlayabilir miyim?


194

Enum'u birkaç sabit yapmak için kullanıyorum:

enum ids {OPEN, CLOSE};

AÇIK değeri sıfır, ancak 100 olarak istiyorum. Mümkün mü?


@ScottF Numaralandırmaların nasıl kullanılmasını istiyor musunuz?
Anish B.

Üst cevapta bir numaralandırma tanımı var. Nasıl tanımlanmış bu numaralandırma kodunda kullanılacak bir örnek istiyorum. Örneğin, tanımlanan ctor belirli bir tamsayı değerine sahip bir enum örneği oluşturmak için nasıl kullanılır?
ScottF

@ScottF ben olsaydım, bu yazı üzerinde bir ödül ayarlamak yerine tamamen yeni bir soru göndermek istiyorum ..... veya, enums hakkında belgeleri okuyun. Bu konuda bazı temel bilgileri kavramanız gerekiyor gibi görünüyor;)
lealceldeiro

enum ids {OPEN = 100, CLOSE};?
Bay Oscar

Yanıtlar:


307

Java numaralandırmalar gerçekten tamsayılar için etiket olan C veya C ++ sıralamaları gibi değildir.

Java sıralamaları daha çok sınıflar gibi uygulanır ve hatta birden çok özniteliği olabilir.

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

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

En büyük fark, tipte güvenli olmaları bir SIZE değişkenine bir COLOR enum atama konusunda endişelenmenize gerek olmadığı anlamına gelir.

Daha fazla bilgi için http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html adresine bakın .


İfadenize dayanarak, bir diziye veya bir şeye bir dizin için sıralı tamsayıların bir enumunu (C ++ enum'a benzer) oluşturmak için java kullanarak en iyi uygulama şöyle yazılabilir: enum Ids {NAME (0), AGE (1 ), YÜKSEKLİK (2), AĞIRLIK (3); } Teşekkürler, -bn
bn.

Muhtemelen, özellikle de bir yerde integral değerleri serileştirdiyseniz.
lavinio

1
bu numaralandırmayı bir işlevde nasıl kullanacağınızı söyleyebilir misiniz?
Bugs

2
Bir enum için bir değerin ayarlanmasına izin vermemek, Java standartlarının tembelliğidir. En azından c # buna izin verir VE bu tür güvenlidir.
Mart'ta csmith

2
FWIW, C ++ 11 artık güvenli bir tipe sahip enum class.
phoenix

93

Evet. Sayısal değerleri numaralandırma yapıcısına şu şekilde aktarabilirsiniz, şöyle:

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

  private int value;    

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

  public int getValue() {
    return value;
  }
}

Daha fazla bilgi için Sun Java Dil Kılavuzu'na bakın.


Güzel. Karıştırmak mümkün mü? Yani yalnızca seçilen Numaralandırma değerlerine numara atar.
Frederick Nord

enum kurucuları için özel değiştirici gereksiz
Nino van Hooff

@FrederickNord - Elbette. Sadece valuesıfır (sıfır) ile başlayan hiçbir argüman içermeyen ikinci bir özel kurucu ekleyin . Ardından DANCEdeğerler listesine (diyelim) ekleyin .
Stephen C

15

bu şekilde kullanma hakkında:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

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

sadece bir yöntem var ..

statik yöntemi kullanabilir ve Enum'u aşağıdaki gibi parametre olarak iletebilirsiniz:

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

Bu iki yolun daha az bellek ve daha fazla işlem birimi kullandığını unutmayın .. Bunun en iyi yol olduğunu söylemiyorum ama sadece başka bir yaklaşım.


1
getColorValue()İkinci örnekte neden senkronize edilir?
josaphatv

@josaphatv İkinci örnekteki tüm işlevler statiktir, asla değişmez. HL_COLORS.getColorValue(HL_COLORS.YELLOW);Numaralandırmayı başlatmadan isteyebilirsiniz .
mazunki

11

Çok büyük numaralandırma türleri kullanırsanız, aşağıdakiler yararlı olabilir;

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

C / C ++ numaralandırmasını taklit etmek istiyorsanız (temel num ve nexts artımları):

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

Ordinal () işlevi, numaralandırıcının tanımlayıcısının göreli konumunu döndürür. Bunu, C-tarzı bir numaralandırmada olduğu gibi bir ofset ile otomatik indeksleme elde etmek için kullanabilirsiniz.

Misal:

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

Çıktı verir:

OPEN:  100
CLOSE: 101
OTHER: 102

Düzenleme: sadece bu ggrandes cevabına çok benzediğini fark ettim , ama burada bırakacağım çünkü çok temiz ve C tarzı bir numaraya ulaşabileceğiniz kadar yakın.


Örnekte bir enum alır ve bir int alırsınız.
Tersini

Soruya göre, bunun en uygun cevap olduğuna inanıyorum. Burada, yeni değişken tanımlanmadan ve yapıcı aracılığıyla atanmadan varsayılan enum dizinini 100'den başlayacak şekilde değiştirdik.
Rahul Jain

@RahulJain Kabul edilen cevabı kullanmayı tercih ederim. Benim için daha temiz görünüyor.
lealceldeiro

1

@scottf

Bir enum bir Singleton gibidir. JVM örneği oluşturur.

Sınıflarla kendiniz yaratırsanız, şöyle görünebilir

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


}

Ve şu şekilde kullanılabilir:

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, Muhtemelen ENUM'da tanımlanan yapıcı yüzünden kafası karıştı.

Bunu açıklayayım.

Ne zaman class loaderyükler enumsınıfı sonra enumyapıcısı da denir. Ne üzerine!! Evet, çağrılır OPENve close. Ne değerleri ile 100için OPENve 200içinclose

Farklı bir değer alabilir miyim?

Evet,

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

Ancak, bu kötü bir uygulamadır. enumtemsil edilmesi için kullanılır constantsgibi days of week, colors in rainbowönceden tanımlanmış sabitler yani bu tür küçük bir grup.


0

Bence C ++ numaralandırıcılarına bakmaktan şaşkınsınız. Java numaralandırıcıları farklıdır.

C / C ++ numaralarına alışkınsanız bu kod olurdu:

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