Bisakah saya menetapkan nilai awal enum di Java?

194

Saya menggunakan enum untuk membuat beberapa konstanta:

enum ids {OPEN, CLOSE};

nilai OPEN adalah nol, tetapi saya menginginkannya sebagai 100. Apakah mungkin?

qrtt1
sumber
@ScottF Anda ingin menggunakan enum?
Anish B.
Di jawaban atas, ada definisi enum. Saya ingin contoh bagaimana enum yang didefinisikan akan digunakan dalam kode. Misalnya bagaimana ctor yang didefinisikan digunakan untuk membuat instance enum dengan nilai integer tertentu.
ScottF
@ScottF jika saya jadi Anda, daripada menetapkan hadiah pada posting ini, saya lebih suka mengirim pertanyaan yang sama sekali baru ..... atau, baca dokumentasi tentang enum. Tampaknya Anda perlu memiliki pengetahuan inti tentangnya;)
lealceldeiro
enum ids {OPEN = 100, CLOSE};?
Tuan Oscar

Jawaban:

307

Enum Java tidak seperti enum C atau C ++, yang sebenarnya hanya label untuk bilangan bulat.

Java enum diimplementasikan lebih seperti kelas - dan mereka bahkan dapat memiliki banyak atribut.

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

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

Perbedaan besar adalah bahwa mereka adalah tipe-aman yang berarti Anda tidak perlu khawatir tentang menetapkan COLOR enum ke variabel SIZE.

Lihat http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html untuk informasi lebih lanjut.

lavinio
sumber
Berdasarkan pernyataan Anda, apakah praktik terbaik menggunakan java untuk membuat enum bilangan bulat berurutan (mirip dengan C ++ enum), untuk indeks ke dalam array atau sesuatu, adalah dengan menulis: enum Id ({NAMA (0), AGE) 1 ), HEIGHT (2), WEIGHT (3); } Terima kasih, -bn
bn.
Mungkin, dan terutama jika Anda membuat cerita tentang nilai integral di suatu tempat.
lavinio
1
dapatkah Anda memberi tahu cara menggunakan enum ini dalam suatu fungsi?
Bugs Terjadi
2
Itu malas standar Java untuk tidak membiarkan nilai ditetapkan untuk enum. Setidaknya c # memungkinkan AND ini tipe-safe.
csmith
2
FWIW, C ++ 11 sekarang memiliki tipe-safe enum class.
phoenix
92

Iya. Anda bisa meneruskan nilai numerik ke konstruktor untuk enum, seperti:

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

  private int value;    

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

  public int getValue() {
    return value;
  }
}

Lihat Panduan Bahasa Sun Java untuk informasi lebih lanjut.

Paul Morie
sumber
Keren. Apakah mungkin untuk mencampur? Yaitu hanya menetapkan angka untuk nilai Enum yang dipilih.
Frederick Nord
pengubah pribadi berlebihan untuk konstruktor enum
Nino van Hooff
@FrederickNord - Tentu. Cukup tambahkan konstruktor pribadi kedua tanpa argumen yang menginisialisasi valueke (katakanlah) nol. Kemudian sertakan (katakanlah) DANCEdalam daftar nilai.
Stephen C
15

bagaimana dengan menggunakan cara ini:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

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

hanya ada satu metode ..

Anda dapat menggunakan metode statis dan meneruskan Enum sebagai parameter seperti:

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

Perhatikan bahwa kedua cara ini menggunakan lebih sedikit memori dan lebih banyak unit proses .. Saya tidak mengatakan ini adalah cara terbaik tetapi hanya pendekatan lain.

Maher Abuthraa
sumber
1
Mengapa getColorValue()disinkronkan dalam contoh kedua?
josaphatv
@ josaphatv Semua fungsionalitas dalam contoh kedua adalah statis, tidak pernah berubah. Anda mungkin ingin melakukannya HL_COLORS.getColorValue(HL_COLORS.YELLOW);tanpa menginisialisasi enum.
mazunki
11

Jika Anda menggunakan tipe enum yang sangat besar, mengikuti dapat bermanfaat;

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

Jika Anda ingin meniru enum C / C ++ (basis num dan tambahan selanjutnya):

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
kakek
sumber
4

Fungsi ordinal () mengembalikan posisi relatif pengenal dalam enum. Anda dapat menggunakan ini untuk mendapatkan pengindeksan otomatis dengan offset, seperti dengan enum gaya-C.

Contoh:

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

Memberikan output:

OPEN:  100
CLOSE: 101
OTHER: 102

Sunting: baru sadar ini sangat mirip dengan jawaban ggrandes , tapi saya akan meninggalkannya di sini karena sangat bersih dan sedekat mungkin dengan enum gaya C.

maharvey67
sumber
Dalam contoh Anda mengambil enum dan mendapatkan int. Bisakah Anda menunjukkan kebalikannya, mengambil int dan berakhir dengan enum (tanpa
kasing
Sesuai pertanyaan, saya percaya ini adalah jawaban yang paling cocok. Di sini kita telah mengubah indeks default enum menjadi mulai dari 100 tanpa mendefinisikan variabel baru dan menugaskan mereka melalui konstruktor.
Rahul Jain
@RahulJain Saya lebih suka menggunakan jawaban yang diterima. Tampaknya lebih bersih bagi saya.
lealceldeiro
1

@scottf

Enum seperti Singleton. JVM menciptakan instance.

Jika Anda akan membuatnya sendiri dengan kelas-kelas itu bisa jadi terlihat seperti itu

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


}

Dan bisa digunakan seperti itu:

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");
    }
}
sperling
sumber
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; }
}

@ skottf, Anda mungkin bingung karena konstruktor yang ditentukan dalam ENUM.

Biarkan saya jelaskan.

Ketika class loadermemuat enumkelas, maka enumkonstruktor juga disebut. Tentang apa!! Ya, ini dipanggil OPENdan close. Dengan nilai 100untuk OPENdan 200untuk apaclose

Bisakah saya memiliki nilai yang berbeda?

Iya,

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

Tapi, itu praktik buruk. enumdigunakan untuk mewakili constantssuka days of week, colors in rainbowyaitu sekelompok kecil konstanta yang telah ditentukan sebelumnya.

Gibbs
sumber
0

Saya pikir Anda bingung melihat enumerator C ++. Pencacah Jawa berbeda.

Ini akan menjadi kode jika Anda terbiasa dengan C / C ++ enums:

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