나는 열거 형을 사용하여 몇 가지 상수를 만듭니다.
enum ids {OPEN, CLOSE};
OPEN 값은 0이지만 100으로 원합니다. 가능합니까?
enum ids {OPEN = 100, CLOSE};
?
나는 열거 형을 사용하여 몇 가지 상수를 만듭니다.
enum ids {OPEN, CLOSE};
OPEN 값은 0이지만 100으로 원합니다. 가능합니까?
enum ids {OPEN = 100, CLOSE};
?
답변:
Java 열거 형은 C 또는 C ++ 열거 형과 다르며 실제로는 정수 레이블입니다.
Java 열거 형은 클래스와 유사하게 구현되며 여러 속성을 가질 수도 있습니다.
public enum Ids {
OPEN(100), CLOSE(200);
private final int id;
Ids(int id) { this.id = id; }
public int getValue() { return id; }
}
큰 차이점은 형식이 안전 하다는 것이므로 COLOR 열거 형을 SIZE 변수에 할당 할 필요가 없습니다.
자세한 내용은 http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html 을 참조 하십시오 .
enum class
있습니다.
예. 다음과 같이 숫자 값을 열거 자 생성자에 전달할 수 있습니다.
enum Ids {
OPEN(100),
CLOSE(200);
private int value;
private Ids(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
자세한 내용은 Sun Java 언어 안내서 를 참조하십시오.
value
(0)으로 초기화 되는 인수가없는 두 번째 개인 생성자를 추가하십시오 . 그런 다음 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);
열거 형을 초기화하지 않고 원할 수 있습니다 .
매우 큰 열거 형을 사용하는 경우 다음이 유용 할 수 있습니다.
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 ++ 열거 형 (기본 숫자 및 다음 증분)을 에뮬레이션하려면 다음을 수행하십시오.
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 () 함수는 열거 형에서 식별자의 상대 위치를 반환합니다. 이를 사용하면 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 스타일 열거 형에 도달 할 수있을만큼 깨끗하고 가깝기 때문에 여기에 남겨 두겠습니다.
scott
열거 형은 싱글 톤과 같습니다. 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);
}
};