2011-06-26 13 views
0

私のアプリ(java)で奇妙な問題が発生しました。java - 列挙型質問

私には列挙型があります。その

public enum myEnum implement myIntrface{ 
    valueA(1),valueb(2),valuec(3),valued(4) 
    private int i; 
    // and then - a constructor 
    public MyEnum(int number){ 
     i = number; 
    }  


    private MyObj obj = new MyObj; 
    // getter and setter for obj 
} 

、別のクラスのようなものが私はbriefeでこの

MyEnum.valueA.setObj(new Obj(...)) 

を持っている - 私は、設定および取得を持つプライベートインスタンスメンバを持つ列挙型を持っています。

は、これまでのところは良い - 。

私は後で私がMyEnum.valueAの値を見ていることである驚かせる唯一のもの()objがnullです。

値をnullに更新するものは何もありません。コンストラクタで既定値を与えても、後でNULLが表示されます。
提案がありますか?

+1

問題を示す完全なコンパイル可能な例を投稿できますか? –

+0

public MyEnum(int number)はコンストラクタではありません。列挙型の名前はmyEnumです。 – Sean

+1

また、列挙型はpublicコンストラクタを持つことができません。 –

答えて

0

列挙型の目的は、定数値を表すことです。定数値のフィールドを設定する意味はありません。

フィールドをfinalと宣言し、コンストラクタを使用してすべてのフィールドを初期化する必要があります。

+0

意味がないかもしれませんが、許可されています。 –

0

は参考のために、次のコードは期待通りに動作します:あなたは本当にこれを実行すべきではありませんので

public class Test { 

    public static enum MyEnum { 
     valueA(1),valueb(2),valuec(3),valued(4); 
     private int i; 
     private Object o; 

     private MyEnum(int number) { 
      i = number; 
     } 

     public void set(Object o) { 
      this.o = o; 
     } 

     public Object get() { 
      return o; 
     } 


    } 

    public static void main(String[] args) { 
     System.out.println(MyEnum.valueA.get()); // prints "null" 
     MyEnum.valueA.set(new Integer(42)); 
     System.out.println(MyEnum.valueA.get()); // prints "42" 
    } 
} 
1

列挙型は非修正のクラスでなければなりません。列挙型のようなタイプベースのオブジェクトの状態を変更する場合は、定数を埋め込んだ最終クラスのアプローチを使用する必要があります。以下は、この問題の原因は、DB40のフレームワークです

public final class Connection { 

    public static final Connection EMAIL = new Connection("email"); 
    public static final Connection PHONE = new Connection("phone"); 
    public static final Connection FAX = new Connection("fax"); 
    /**/ 
    private final String unmodifiableName; //<-- it's final 
    private String modifiableName; 

    /* 
    * The constructor is private so no new connections can be created outside. 
    */ 
    private Connection(String name) { 
     this.unmodifiableName = name; 
    } 

    public String getUnmodifiableName() { 
     return unmodifiableName; 
    } 

    public String getModifiableName() { 
     return modifiableName; 
    } 

    public void setModifiableName(String modifiableName) { 
     this.modifiableName = modifiableName; 
    } 

}