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ü?
enum ids {OPEN = 100, CLOSE};
?
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ü?
enum ids {OPEN = 100, CLOSE};
?
Yanıtlar:
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 .
enum class
.
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.
value
sıfır (sıfır) ile başlayan hiçbir argüman içermeyen ikinci bir özel kurucu ekleyin . Ardından DANCE
değerler listesine (diyelim) ekleyin .
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.
getColorValue()
İkinci örnekte neden senkronize edilir?
HL_COLORS.getColorValue(HL_COLORS.YELLOW);
Numaralandırmayı başlatmadan isteyebilirsiniz .
Ç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;
}
}
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
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.
@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");
}
}
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 loader
yükler enum
sınıfı sonra enum
yapıcısı da denir. Ne üzerine!! Evet, çağrılır OPEN
ve close
. Ne değerleri ile 100
için OPEN
ve 200
iç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. enum
temsil edilmesi için kullanılır constants
gibi days of week
, colors in rainbow
önceden tanımlanmış sabitler yani bu tür küçük bir grup.
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);
}
};