2012-05-29 122 views
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中的字段为空。我终于找出原因。 (枚举仅在第一次被调用时才被实例化)。为了解决这个问题,我在使用特定文件中的Bar之前添加了FOO.TATA;Java枚举实例化

所以我的问题,是否有一个更优雅的方式来确保一个枚举在另一个之前实例化?

+3

做这些枚举代表在现实生活中?看起来这不是使用枚举的好地方。 –

+0

@NikitaBeloglazov它正在工厂使用..不幸的是,我没有我的话在这个问题上说。 –

回答

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()); 
    } 
} 
+0

谢谢,这不完全是我所做的,但我给了我一个好主意! –