Saya menggunakan enum untuk membuat beberapa konstanta:
enum ids {OPEN, CLOSE};
nilai OPEN adalah nol, tetapi saya menginginkannya sebagai 100. Apakah mungkin?
enum ids {OPEN = 100, CLOSE};?
Saya menggunakan enum untuk membuat beberapa konstanta:
enum ids {OPEN, CLOSE};
nilai OPEN adalah nol, tetapi saya menginginkannya sebagai 100. Apakah mungkin?
enum ids {OPEN = 100, CLOSE};?
Jawaban:
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.
enum class.
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.
valueke (katakanlah) nol. Kemudian sertakan (katakanlah) DANCEdalam daftar nilai.
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.
getColorValue()disinkronkan dalam contoh kedua?
HL_COLORS.getColorValue(HL_COLORS.YELLOW);tanpa menginisialisasi enum.
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;
}
}
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
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.
@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");
}
}
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.
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);
}
};