2012-02-23 2 views
5

열거 형을 가진 배열을 참조하고 싶습니다. 이것은 C++ (내 기원)에서 꽤 표준적인 것이지만, 이것이 Java에서 가능하거나 바람직한지 확실하지 않습니다.Java : 배열 참조로 enum 사용

Amount[COAL] // The amount of coal 
Price[IRON] // The price of iron 

내가 Amount을 만들고 싶어하지 않고 : 나중에 내가 이런 식으로 참조하고 싶은 그런

public enum Resource { 
    COAL, 
    IRON 
} 

예를 들어, 내가 열거 등을하고 싶은

Price 필드는 Resource입니다. 리소스 유형별로 그룹화 된 개체 목록 (리소스 주문)이 필요합니다. Resource의 각 유형에 int를 수동으로 할당하는 것은 public static int final BLAH보다 좋지 않습니다. 아무 것도 얻지 못했습니다.

본질적으로, 나는 물건에 태그를 붙이는 C++의 enum을 찾고있다. 나는 이것이 Java에서 일을하는 '잘못된'방법 일 수 있다는 것을 알고 있으므로 정확한 Java 기술의 방향으로 나를 가리켜 주도록하십시오.

답변

12

C++에서 열거 형은 실제로 정수의 별칭입니다. 자바에서는 "적절한"객체입니다. 따라서 배열 참조로 사용할 수 없습니다.

배열에서 특정 enum 객체와 연결된 값을 찾고 싶다면 - Map to me! 배열을 EnumMap<Resource, Double>으로 대체하는 방법은 무엇입니까?

EnumMap 클래스는 열거 형 키와 함께 사용하도록 최적화되어 있으므로 열거 형의 서수 (정수) 값에 키잉 된 배열을 사용하게됩니다. 따라서 범용 해시 맵보다 훨씬 빠르며 의미 론적 표현력이 Map 인 배열 기반 솔루션의 속도를 얻을 수 있습니다. 두 언어 모두에서 가장 좋습니다.

+0

아! 이것은 내가 원했던 것입니다. 정말 고마워요! – Cramer

-1

불행하게도, 당신이 약간 더 긴 구문이 필요합니다 :

Amount[COAL.ordinal()] // The amount of coal 
Price[IRON.ordinal()] // The price of iron 

을하는이 마음에 들지 않는다면, 상수 유일한 옵션, 도움 즉

public class Resource { 
    public static final int COAL = 0; 
    public static final int IRON = 1; 

} 

희망 할 수있다.

+1

'ordinal()'을 사용해서는 안됩니다.'enum'에 다른 필드를 추가하거나, 알파벳 순으로 재정렬하면 코드가 깨져서 그 이유를 알아내는 것이 거의 불가능합니다. 'Map'은 훨씬 더 우아하고 자바와 같은 솔루션입니다. – Marcelo

+0

아마도 ...하지만 Cramer가 가진 질문에 답할 수 있습니다. –

+0

그것은 (일종의) 않습니다,하지만 또한 * "자바에서 일을하는 '잘못된 방법"*. – Marcelo

1

거의 할 수 있습니다. enum이 단지 int 인 C++와 달리 Java의 enum은 클래스입니다. 따라서 배열의 인덱스로 사용할 수 없습니다. 그러나 모든 열거 요소는 int이며 ordinal()을 가지고, 그래서 당신은

amount[COAL.ordinal()] 
price[IRON.ordinal()] 

을 말할 수 있습니다하지만 당신은 더 나은 방법이있다. 열거 형에 메서드를 추가 할 수 있으므로 다음과 같이 표시됩니다.

IRON.price(amounts) 
COAL.amount(prices) 

이 방법이 훨씬 효과적이라고 생각합니다. 난 당신이 EnumMap는 찾고있는 생각

1

:

그것은 같이 끝난다. 예 :

COAL.ordinal() 

그러나 클래스를 만드는 것이 나을 것 같습니다. 금액 및 가격 입력란을 사용하여 주문한 다음 예 : enum 요소에 의해 색인화 된 Map

Map<Resource, Order> orders = new HashMap<Resource, Order>(); 
orders.put(Resource.COAL, new Order(price, amount)); 
0

지도는보다 동적 인 데이터에 매우 적합합니다. 그러나 이중 이름, 이중 값, 기존 이름/값 및 모든 내용을 모두 검사하도록 코딩해야합니다. 이 경우에도 오류가 발생하면 런타임에만 발견됩니다.

더 많은 정적 데이터를 사용하려면 원시 열거 형을 사용하지 말고 new type enums from Java 6을 사용하십시오. 그들은 훌륭합니다! 오류는 컴파일러에서 찾을 수 있습니다.

public enum Resource{ 
    COAL(0), IRON(1); 
    int index; 
    private Resource(int index){ 
     this.index=index; 
    } 
} 
... 
amount[Resource.COAL.index]=... 

그러나 더 나은 변형은 다음과 같습니다

public enum Resource{ 
    COAL(538,0.5f), IRON(115,1.5f); 
    int amount; 
    float price; 
    private Resource(int amount, float price){ 
     this.amount=amount; 
     this.price=price; 
    } 
} 
... 
Resource.COAL.amount=... 

당신은 자신의 이름을 사용할 수 있습니다.

당신은 모든 열거를 통해주기를 만들 수 :

for(Resource resourceType: Resource.values()) { 
    String toOutput=resourceType.name()+" amount="+ resourceType.amount; 
}