2012-05-10 4 views
1

나는 큰 열거 내 클래스에서 선언 한열거 형?

public enum CarMaker{ 
     Honda, 
     Toyota, 
     Sony, 
     ...; 

     public CarMaker at(int index){ //a method to retrieve enum by index 
       CarMaker[] retval = this.values(); 
       return retval[index]; 
     } 
     public final SomeObj val; //a value associated with each enum 
      //.. more custom functions if needed 
    } 

각 자동차 메이커의 하나의 인스턴스 만이 필요하기 때문에, 나는 배열 대신 액세스 (같은 스토리지로이 열거를 사용하려면이 나쁜 방법입니다 인덱스를 사용하여 각 요소는, 나는 또한 "혼다"자신의 인스턴스를 생성하는 각 요소에 대한 사용자 정의 함수)

CarMaker A = CarMaker.Honda; 
CarMaker B = CarMaker.at(1); 
//Error above b/c 'at' is not a static member, can I make at a static member? 

A.val = 5; 
B.val = 6; 
//Here I want A to be share data with B since both are "Honda" 
//but it doesn't seem to do that yet 
System.out.println(A) 
System.out.println(B) 

//Expected output: 
//A: 6 
//B: 6 

을 지금 A와 B 보일 수 있습니다.보다 직관적 인 이름을 사용할 수 있습니다,하지만 난에 원하는 공유 할 수 있습니다. 가능한가?

+3

소니는 차를 만들어? –

+1

어쨌든 당신은 내 아이디어를 얻습니다. : P – Bonk

+0

열거 형은 별도의 인스턴스가 없으므로 문제가 발생하는 방식을 볼 수 없습니다. A와 B는 하나의 동일한 객체 여야합니다. –

답변

2

enum을 사용하지만 composition을 사용하십시오. enum이라는 브랜드 이름을 만든 다음 열거 형 필드를 보유 할 이름이 필요한 객체를 만듭니다.

public enum CarMaker { 
    Honda, 
    Toyota, 
    Sony, 
    Olympus, 
    Facebook, 
    Google, 
    ... 
} 

public class Car { 
    CarMaker carMaker; 
    //... etc.... 

    Car(CarMaker carMaker) { 
     this.carMaker = carMaker; 
     // ... more code 
    } 

    //.... 
+0

빠른 응답을 주셔서 감사합니다. 빠른 예를 들어 주시겠습니까? – Bonk

+0

@YonkShi : 예를 들면. –

+0

@YonkShi : 배열과 같은이 열거 형을 인덱스로 사용하려는 경우 인덱스를 사용하여 각 요소에 액세스 할 때 더 직관적 인 이름을 사용할 수 있지만 "열악한 습관입니다. EnumMap을 사용하려고합니다. –

5

enums는 변경 불가능한 상수로 간주됩니다. 그들에게 공개적이고 수정 가능한 필드를주는 것은 끔찍한 생각입니다.

+0

............. 아멘! –

+0

그게 내가 생각하기에,하지만 사용자 정의 개체 그룹에 직관적 인 이름을 할당하는 다른 방법을 생각할 수는 없습니다. 너무 나쁘다 [] 자바에서 연산자를 오버로드 할 수 없습니다. 그렇지 않으면 전 열거를 버리고 싶습니다. – Bonk

+0

@YonkShi * 사용자 정의 개체 그룹에 직관적 인 이름 지정 * 당신은 무엇을 의미합니까? – Jeffrey