2012-01-20 1 views
2

2つの列挙型が互いに参照することがあります。それぞれには、他の列挙型のパラメータを持つコンストラクタがあります。互いに参照する列挙型は、呼び出される順序によって異なる結果を生成します。

彼らのようなものに見える:しかし列挙は私が参照変数にnull値を得ることができ、最初に呼び出すかに応じ

SchoolEnum(ImmuneEnum value) 
{ 
    this.immune = value; 
} 

ImmuneEnum(SchoolEnum value) 
{ 
    this.school = value; 
} 

を。

ImmunityEnum immune = ImmunityEnum.IMMUNE_KANNIC; 
SchoolEnum school = SchoolEnum.KANNIC; 
System.out.println(school.getImmune()) 
System.out.println(immune.getSchool()); 

は出力を生成します。 ヌル Kannic

SchoolEnum school = SchoolEnum.KANNIC; 
ImmunityEnum immune = ImmunityEnum.IMMUNE_KANNIC; 
System.out.println(school.getImmune()) 
System.out.println(immune.getSchool()); 

は出力を生成します。 immunekannic ヌル

へと「鶏と卵」問題のビットのようですenumがインスタンス化されたとき。しかし、それぞれが適切に他を参照させる方法はありますか?人工的に2つのシングルトンハッシュマップを作成することを検討していますが、より良いアイデアはありますか?

+0

列挙子:

enum SchoolEnum { KANNIC; private ImmunityEnum immune; public ImmunityEnum getImmune() { return immune; } public void setImmune(ImmunityEnum immune) { this.immune = immune; } } enum ImmunityEnum { IMMUNE_KANNIC; private SchoolEnum school; public SchoolEnum getSchool() { return school; } public void setSchool(SchoolEnum school) { this.school = school; } } 

は今、このようにそれを使うのか?他のコンストラクタを持つコンストラクタ?列挙子はなく、ctorsは "ctors"を持たず、もう一方を参照するインスタンス変数を設定します。あなたはそれらを構築する場所を表示しませんが、それぞれが他のものを参照するシングルトンである場合、デザインを再考したいかもしれません - 実際の関係は何ですか? –

+0

私は、各コンストラクタにコンストラクタがあるとは言いませんでした。私はそれぞれのコンストラクタにパラメータがあると言っていました。 – Robert

答えて

1

あなたはあなたのコンストラクタに文字列パラメータを渡す場合:

public enum SchoolEnum { 
    Kannic("immnunekannic"); 
    private String immune; 
    public SchoolEnum (String immune) {this.immune = immune;} 
    public ImmuneEnum getImmune() { 
     return ImmuneEnum.valueOf(immune); 
    } 
} 

public enum ImmnueEnum { 
    immunekannic("Kannic"); 
    private String scholl; 
    public ImmnueEnum (String school) {this.school = school;} 
    public SchoolEnum getSchool() { 
     return SchoolEnum.valueOf(school); 
    } 
} 

しかし、正直なところ、それはドメインモデルのこのタイプを作成するには少し奇妙です。あなたのユースケースは何ですか?

+0

ええと、これを試してみるとうまくいくようです。私はそれが私の元のコンストラクタの循環性を避けると思う。ありがとう! – Robert

2

それは、世界で最も美しい解決策ではないのですが、どのように相互参照の設定についてその後:?

SchoolEnum school = SchoolEnum.KANNIC; 
school.setImmune(ImmunityEnum.IMMUNE_KANNIC); 
ImmunityEnum immune = ImmunityEnum.IMMUNE_KANNIC; 
immune.setSchool(SchoolEnum.KANNIC); 

System.out.println(school.getImmune()); 
System.out.println(immune.getSchool()); 
+0

ありがとう、私もこれを行うことを検討していた。おそらく、私のSingleton hashmapアイデアよりも優れているはずです。 – Robert

0
public enum SchoolEnum { 
    KANNIC { 

    @Override 
    public ImmunityEnum getImmune() { 
     return ImmunityEnum.IMMUNE_KANNIC; 
    } 
    }; 

    public abstract ImmunityEnum getImmune(); 
} 

public enum ImmunityEnum { 
    IMMUNE_KANNIC { 

    @Override  
    public SchoolEnum getSchool() { 
     return SchoolEnum.KANNIC; 
    } 
    }; 

    public abstract SchoolEnum getSchool(); 
} 
関連する問題