ฉันใช้ Enum เพื่อสร้างค่าคงที่ไม่กี่:
enum ids {OPEN, CLOSE};
ค่า OPEN เป็นศูนย์ แต่ฉันต้องการให้เป็น 100 เป็นไปได้ไหม
enum ids {OPEN = 100, CLOSE};
?
ฉันใช้ Enum เพื่อสร้างค่าคงที่ไม่กี่:
enum ids {OPEN, CLOSE};
ค่า OPEN เป็นศูนย์ แต่ฉันต้องการให้เป็น 100 เป็นไปได้ไหม
enum ids {OPEN = 100, CLOSE};
?
คำตอบ:
Java enums ไม่เหมือนกับ C หรือ C ++ enums ซึ่งเป็นเพียงป้ายกำกับสำหรับจำนวนเต็ม
Java enums ถูกนำมาใช้มากขึ้นเช่นคลาส - และพวกเขายังสามารถมีหลายคุณลักษณะ
public enum Ids {
OPEN(100), CLOSE(200);
private final int id;
Ids(int id) { this.id = id; }
public int getValue() { return id; }
}
ความแตกต่างที่สำคัญคือพวกเขาปลอดภัยประเภทซึ่งหมายความว่าคุณไม่ต้องกังวลกับการกำหนดสี enum ให้กับตัวแปร SIZE
ดูhttp://docs.oracle.com/javase/tutorial/java/javaOO/enum.htmlสำหรับข้อมูลเพิ่มเติม
enum class
ตอนนี้มีชนิดปลอดภัย
ใช่. คุณสามารถส่งค่าตัวเลขไปยังตัวสร้างสำหรับ enum ดังนี้:
enum Ids {
OPEN(100),
CLOSE(200);
private int value;
private Ids(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
ดูคู่มือภาษาซันชวาสำหรับข้อมูลเพิ่มเติม
value
เป็นศูนย์ (พูด) จากนั้นรวม (พูด) DANCE
ในรายการค่า
เกี่ยวกับการใช้วิธีนี้:
public enum HL_COLORS{
YELLOW,
ORANGE;
public int getColorValue() {
switch (this) {
case YELLOW:
return 0xffffff00;
case ORANGE:
return 0xffffa500;
default://YELLOW
return 0xffffff00;
}
}
}
มีวิธีเดียวเท่านั้น ..
คุณสามารถใช้วิธีการคงที่และผ่าน Enum เป็นพารามิเตอร์เช่น:
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;
}
}
โปรดทราบว่าทั้งสองวิธีใช้หน่วยความจำน้อยลงและหน่วยประมวลผลเพิ่มเติม .. ฉันไม่ได้บอกว่านี่เป็นวิธีที่ดีที่สุด แต่เป็นเพียงแนวทางอื่น
getColorValue()
ซิงโครไนซ์ในตัวอย่างที่สอง
HL_COLORS.getColorValue(HL_COLORS.YELLOW);
โดยไม่เริ่มต้น enum
หากคุณใช้ประเภท enum ขนาดใหญ่มากการติดตามจะมีประโยชน์
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;
}
}
หากคุณต้องการเลียนแบบ enum ของ C / C ++ (ฐาน num และ nexts ส่วนเพิ่ม):
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
ฟังก์ชันเลขลำดับ () จะคืนค่าตำแหน่งสัมพัทธ์ของตัวระบุใน enum คุณสามารถใช้สิ่งนี้เพื่อรับการจัดทำดัชนีอัตโนมัติด้วยออฟเซ็ตเช่นเดียวกับ enum สไตล์ C
ตัวอย่าง:
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);
}
};
ให้ผลลัพธ์:
OPEN: 100
CLOSE: 101
OTHER: 102
แก้ไข: เพิ่งรู้ว่านี่คล้ายกับคำตอบของ ggrandesมาก แต่ฉันจะทิ้งไว้ที่นี่เพราะมันสะอาดมากและใกล้ที่สุดเท่าที่คุณจะไปถึงสไตล์ C enum
@scottf
Enum เป็นเหมือนซิงเกิล JVM สร้างอินสแตนซ์
หากคุณจะสร้างมันด้วยตัวเองด้วยชั้นเรียนอาจเป็นเช่นนั้น
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 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 คุณอาจสับสนเนื่องจากตัวสร้างที่กำหนดใน ENUM
ฉันขออธิบายว่า
เมื่อclass loader
โหลดenum
คลาสแล้วตัวenum
สร้างที่เรียกว่า เกี่ยวกับอะไร !! ใช่มันเรียกว่าบนและOPEN
close
มีค่า100
สำหรับอะไรOPEN
และ200
สำหรับclose
ฉันมีค่าต่างกันได้ไหม
ใช่,
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; }
}
แต่มันเป็นการปฏิบัติที่ไม่ดี enum
ถูกนำมาใช้สำหรับการเป็นตัวแทนconstants
เช่นdays of week
, colors in rainbow
คือกลุ่มเล็ก ๆ เช่นของค่าคงที่ที่กำหนดไว้ล่วงหน้า
ฉันคิดว่าคุณสับสนจากการดูตัวแจงนับ C ++ ตัวแจงนับ Java แตกต่างกัน
นี่จะเป็นรหัสถ้าคุณคุ้นเคยกับการแปลภาษา C / C ++:
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);
}
};