2012-05-29 4 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; 
    } 
} 

Le problème était que dans mon code j'ai appelé BAR avant FOO. Le résultat était les champs dans BAR étaient null. J'ai finalement découvert pourquoi. (enum sont seulement instanciés quand ils sont appelés pour la première fois). Pour résoudre ce problème, j'ai ajouté FOO.TATA; avant d'utiliser Bar dans un fichier spécifique.Java Enum instantiation

Donc, ma question, Y at-il une façon plus élégante de s'assurer qu'une énumération est instanciée avant une autre?

+3

Que signifient ces ENUM représentent dans la vie réelle? Il semble que ce n'est pas un très bon endroit pour utiliser des enums. –

+0

@NikitaBeloglazov étant utilisé dans une usine .. et malheureusement je n'ai pas ma parole à dire sur ce sujet. –

Répondre

2

Comme ils sont étroitement liés les uns aux autres, je les mettrais dans la même classe, qui jouerait le rôle d'un médiateur:

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

Merci, ce n'est pas exactement ce que j'ai fait mais je me donne une bonne idée! –