Tôi sử dụng enum để tạo một vài hằng số:
enum ids {OPEN, CLOSE};
giá trị MỞ bằng 0, nhưng tôi muốn nó là 100. Có thể không?
enum ids {OPEN = 100, CLOSE};
?
Tôi sử dụng enum để tạo một vài hằng số:
enum ids {OPEN, CLOSE};
giá trị MỞ bằng 0, nhưng tôi muốn nó là 100. Có thể không?
enum ids {OPEN = 100, CLOSE};
?
Câu trả lời:
Các enum Java không giống như các enum C hoặc C ++, mà thực sự chỉ là các nhãn cho các số nguyên.
Các enum Java được triển khai giống như các lớp hơn - và chúng thậm chí có thể có nhiều thuộc tính.
public enum Ids {
OPEN(100), CLOSE(200);
private final int id;
Ids(int id) { this.id = id; }
public int getValue() { return id; }
}
Sự khác biệt lớn là chúng là loại an toàn , điều đó có nghĩa là bạn không phải lo lắng về việc gán enum MÀU cho biến SIZE.
Xem http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html để biết thêm.
enum class
.
Đúng. Bạn có thể truyền các giá trị số cho hàm tạo cho enum, như vậy:
enum Ids {
OPEN(100),
CLOSE(200);
private int value;
private Ids(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
Xem Hướng dẫn ngôn ngữ Sun Java để biết thêm thông tin.
value
thành số không (nói). Sau đó bao gồm (nói) DANCE
trong danh sách các giá trị.
những gì về cách sử dụng theo cách này:
public enum HL_COLORS{
YELLOW,
ORANGE;
public int getColorValue() {
switch (this) {
case YELLOW:
return 0xffffff00;
case ORANGE:
return 0xffffa500;
default://YELLOW
return 0xffffff00;
}
}
}
chỉ có một phương pháp ..
bạn có thể sử dụng phương thức tĩnh và truyền Enum làm tham số như:
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;
}
}
Lưu ý rằng hai cách này sử dụng ít bộ nhớ hơn và nhiều đơn vị xử lý hơn .. Tôi không nói đây là cách tốt nhất nhưng nó chỉ là một cách tiếp cận khác.
getColorValue()
đồng bộ hóa trong ví dụ thứ hai?
HL_COLORS.getColorValue(HL_COLORS.YELLOW);
mà không khởi tạo enum.
Nếu bạn sử dụng các loại enum rất lớn sau đó, sau đây có thể hữu ích;
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;
}
}
Nếu bạn muốn mô phỏng enum của C / C ++ (số gia cơ bản và số 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
Hàm ordinal () trả về vị trí tương đối của mã định danh trong enum. Bạn có thể sử dụng điều này để có được lập chỉ mục tự động với phần bù, như với enum kiểu C.
Thí dụ:
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);
}
};
Cung cấp đầu ra:
OPEN: 100
CLOSE: 101
OTHER: 102
Chỉnh sửa: chỉ nhận ra điều này rất giống với câu trả lời của ggrandes , nhưng tôi sẽ để nó ở đây vì nó rất sạch sẽ và gần đến mức bạn có thể đến với enum kiểu C.
@scottf
Một enum giống như một Singleton. JVM tạo cá thể.
Nếu bạn tự tạo nó với các lớp, nó có thể trông như thế
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;
}
}
Và có thể được sử dụng như thế:
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, Có lẽ bạn nhầm lẫn vì hàm tạo được xác định trong ENUM.
Hãy để tôi giải thích điều đó.
Khi class loader
tải enum
lớp, thì enum
constructor cũng được gọi. Về những gì!! Vâng, nó được gọi là OPEN
và close
. Với những giá trị nào 100
cho OPEN
và 200
choclose
Tôi có thể có giá trị khác nhau?
Đúng,
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; }
}
Nhưng, đó là thực tế xấu. enum
được sử dụng để biểu diễn constants
like days of week
, colors in rainbow
tức là nhóm nhỏ các hằng số được xác định trước như vậy.
Tôi nghĩ rằng bạn đang bối rối khi nhìn vào các điều tra viên C ++. Điều tra viên Java là khác nhau.
Đây sẽ là mã nếu bạn đã quen với enum 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);
}
};