1
public enum FOO{
    TATA(TOTO,TITI);

    public FOO(BAR bar1,BAR bar2) {
        bar1.associate(this,bar2);
    }
}

public enum BAR {
    TOTO,
    TITI;

    private FOO _foo;
    private BAR _bar;

    public void associate(FOO foo,BAR bar) {
        _foo = foo;
        _bar = bar;
    }
}

問題は、私のコードでFOOの前にBARを呼び出したことです。その結果、BARのフィールドはnullになりました。私はついにその理由を知りました。(列挙型は、初めて呼び出されたときにのみインスタンス化されます)。この問題を修正するためFOO.TATA;に、特定のファイルでBarを使用する前に追加しました。

だから私の質問、ある列挙型が別の列挙型の前にインスタンス化されることを確認するためのよりエレガントな方法はありますか?

4

1 に答える 1

2

それらは互いに密接に関連しているので、私はそれらを同じクラスに入れ、それが仲介者の役割を果たします。

public class FooBar {
    static {
        Bar.TOTO.associate(Foo.TATA, Bar.TITI);
    }

    public enum Foo {
        TATA;
    }

    public enum Bar {
        TOTO,
        TITI;

        private Foo _foo;
        private Bar _bar;

        private void associate(Foo foo, Bar bar) {
            _foo = foo;
            _bar = bar;
        }

        public Foo getFoo() {
            return _foo;
        }

        public Bar getBar() {
            return _bar;
        }
    }

    public static void main(String[] args) {
        System.out.println(FooBar.Bar.TITI.getFoo());
        System.out.println(FooBar.Bar.TITI.getBar());
        System.out.println(FooBar.Bar.TOTO.getFoo());
        System.out.println(FooBar.Bar.TOTO.getBar());
    } 
}
于 2012-05-29T16:52:54.157 に答える