2016-12-17 11 views
1

私はBOBとALIC​​Eを持つEnumを持っていて、フィールドに年齢を格納しています。列挙型で年齢を変更するメソッドを持つことはできますか?それはコンパイラがそれを取るが、任意のリスクがある/それは悪い練習ですか?だから、例えば:Java:実行時に列挙型フィールドを変更することは許されていますか?

public enum Friends { 
    BOB(14), 
    ALICE(22); 

    private int age; 

    private Friends(int age){ 
     this.age = age; 
    } 

    public void setAge(int age){ 
     this.age = age; 
    } 

    public int getAge(){ 
     return age; 
    } 
} 
+0

同じことを試しましたか? – Panther

+2

enumの変数はグローバル変数であり、注意して使用する必要があります。それらは定数でなければならず、したがって不変です。そうしないと、デバッグが不可能な異常なバグに終わることがあります。列挙型の内部で変数を変更する必要があると感じる場合は、おそらく列挙型を間違って使用している可能性があります。 – Tobb

+0

あなたの質問は実際には[XY問題](http://mywiki.wooledge.org/XyProblem)のように聞こえるところがあります。本当の解決策が別のアプローチを完全に使用するのであれば。はい、あなたは列挙型が保持するフィールドの状態を変更することができます。私は@Tobbに同意します。これは私にとって正しいことではありません。おそらく、EnumMapのような別の構文を使用することを望みます。各列挙型を潜在的に変更可能なオブジェクトに関連付けます。 –

答えて

0

のJava:それは、実行時に列挙型のフィールドを変更することが許されていますか?

Enum自体は変更できませんが、はい、列挙型の値で定義されているフィールドは変更できます。

年齢を変更する列挙型のメソッドを使用できますか? コンパイラがそれをとるようですが、リスクはありますか?それは悪い習慣ですか?

はい、あなたはEnumsを使いこなすことができます。

列挙型は、「物」の安定した固定列挙を表すように設計されています。
これらは定数と考えることができます。 Oracle documentationから

列挙型は、定義済みの定数の 設定する変数の可能特殊なデータ・タイプです。変数は、あらかじめ定義されている値のうち、 のいずれかに等しくなければなりません。一般的な例には、 コンパスの指示(NORTH、SOUTH、EAST、WESTの値)と 曜日が含まれます。

これらは定数なので、列挙型のフィールド名は大文字の です。

Java Enumでは、これらのこと自体をプロパティで記述することができます。あなたが列挙型を定義するとき

、あなたはそれを実行します。

public enum Friends { 
    BOB(14), 
    ALICE(22); 

    private int age; 

    private Friends(int age){ 
     this.age = age; 
    } 

あなたの事は何人かの友人であり、年齢は友達のプロパティです。
あなたの列挙型の問題は、あなたのものが安定したものではないように見えることです。友情は移動するものであり、enumを記述するために使用するプロパティです。

あなたの例では、あなたの友人は州のインスタンスのように見えます。
友達を表現するための単純なクラス(Enumとは反対)を定義し、クライアントコード内でそれらをインスタンス化して変更することは、それらを表現して行動するためのより自然な方法です。