2012-05-10 18 views
1

私は、各自動車メーカーのインスタンスが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は1つの同じオブジェクトでなければなりません。 –

答えて

2

enumを使用して作成する:ブランド名の列挙を作成しますが、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

enumは、不変の定数であると考えられている。それらに公開された変更可能なフィールドを与えることは恐ろしい考えです。

+0

.............アーメン! –

+0

これも私が思ったことですが、私はカスタムオブジェクトのグループに直感的な名前を割り当てる他の方法を考えることはできません。あまりにも悪い私はJavaの[]演算子をオーバーロードできません。さもなければ、私は完全にenumを捨てます。 – Bonk

+0

@YonkShi *カスタムオブジェクトのグループに直感的な名前を割り当てる*あなたはどういう意味ですか? – Jeffrey