2011-06-24 16 views
3

言ってやるが、私はいくつかのクラスを持っているJavaの非静的な列挙型

enum Attributes { 
STRENGTH, INTELLIGENCE, AGILITY...//etc 
} 

enum Skills { 
GUNS, MELEE, ATHLETICS...//etc 
} 

さて、私はそれが、各インスタンスとなるようにしたかったとしましょうPlayerまたはNPCのいずれかの実際のインスタンスは、列挙型の値を加算したり減算したりすることができる独自の属性またはスキルのインスタンスを実際に持つことができます。これは可能ですか?そうでなければ、それが存在するクラスのフィールド値を操作するために、ネストされたネストされた列挙体内のメソッドを使用することは可能でしょうか?

これはややばかげてばかげて、ちょうど右のpremadonnicに聞こえるかもしれませんが、正しいデザインソリューションを見つけなければならない時には、時には箱の外で考える必要があります。

編集:私はそれがマップのアイデアと同じくらい良いことだ疑うのに

私は、興味深い解決策を見つけました。私はそれだけで投稿する興味深いものになるだろうと考え出し

:D

public final class StatControl { 

    int agility; 
    int endurance; 
    int intelligence; 
    int intuition; 
    int luck; 
    int speed; 
    int strength; 

} 

enum Attributes { 
    AGILITY { 
     void add(int value) { 
      test.agility += value; 
     } 
    }, 
    ENDURANCE {}, 
    INTELLIGENCE {}, 
    INTUITION {}, 
    LUCK {}, 
    SPEED {}, 
    STRENGTH {}; 

    abstract void add(int value); 

    StatControl test; 

    void receiveObj(StatControl test) { 
     this.test = test; 
    } 

} 

あなたが見ることができるように、クラスが列挙型の整数表現を保持しているが、列挙型自身が操作できるコントロールセンターとして機能しますそれに渡されたStatControlオブジェクトのインスタンス。

地図はおそらくもっと良いですが、どこが簡単に乱れているのか分かります。

+2

ようEnumMapsを使用することができますか? –

+0

そして、enum名や名前空間を変更することで、似たような別々の列挙型にすることができます。つまり、それらを別々のパッケージに置くことができます。 –

+0

別のオプションとして、同じ列挙型を使用することもできますが、異なる列挙型マップを使用して、列挙型に必要なすべての種類の値をマップできます。 –

答えて

3

さらに検討すると、それぞれの列挙型に関連する別の値を持つようにするには、異なる列挙型のEnumMapsに同じ列挙型を使用することをお勧めします。この答えが左のフィールドにある場合は、申し訳ありませんが、あなたの質問を明確にしてください。 :) EnumMapsの詳細について

を、ここを見てください:あなたが列挙型のすべてのインスタンスに属性を追加することができます
Taming Tiger: Beyond the basics of enumerated types
EnumMap API

+0

全くありません。それは良いアイデアのように思える...私はちょっとした説明のために、皆さんが何を考えているかを見るために持っていなければならない別の考えを掲示します。 – zeboidlund

0

。惑星の例を参照してください:

http://download.oracle.com/javase/1,5.0/docs/guide/language/enums.html

+0

インスタンスでは、同じ列挙型の別個のインスタンスを意味しますか? – zeboidlund

+0

はい、 – leifg

+0

の例では、さまざまな惑星のインスタンス(土、水銀、金星など)を見ていますが、この質問では「それぞれが異なる半径を持つ 'MARS」のXインスタンスを持つことができますか? 9人の異なる値を持つ9人のSTRENGTH属性を持つなど、 –

1

あなたは、「列挙型の値を加算および減算可能性がある」とはどういう意味ですか

abstract class Actor { 
    final Map<Attribute, Integer> attributes = new EnumMap<Attribute, Integer>(); 
    final Map<Skill, Integer> skills = new EnumMap<Attribute, Integer>(); 

    abstract void doStuff(); 
} 

class NPC extends Actor { 
    void doStuff() { } 
} 

class Player extends Actor { 
    void doStuff() { } 
}