2012-06-01 9 views
6

私はちょうどEnum#toString javadoc状態(強調鉱山)ことに気づい:宣言に含まれているとして、この列挙型定数の名前を返しますEnum#をオーバーライドすることは望ましくありません。

このメソッドはオーバーライドできますが、通常はが必要ではなく、が望ましいではありません。より "プログラマフレンドリー"な文字列形式が存在する場合、enum型はこのメソッドをオーバーライドする必要があります。

デフォルトで

toString()name()同じものを返し、そうtoStringが上書きされていても一度、1はまだname()方法で列挙型の名前にアクセスすることができます。

Enum#toStringを無効にするのが望ましいとは思わないのは誰ですか?

EDIT:参考のため、name()のJavadocの(元のように重点):

が列挙宣言で宣言されたとおりに、この列挙定数の名前を返します。 ほとんどのプログラマは、toStringメソッドがよりわかりやすい名前を返す場合があるため、このメソッドよりもtoString()メソッドを優先して使用する必要があります。このメソッドは主に、正確な名前を取得することによって正確さが変わる特殊な状況で使用するように設計されています。名前はリリースごとに異なります。

+0

列挙型の値をすべて大文字(たとえば、VALUE)にする必要があるという既存のコーディング規則がある場合に、それが望ましくない場合があります。 'name.toLowerCase()'や他のケースの操作を返すように実装されているかもしれません。 – jpm

+0

私の使用例は、enumがユーザに表示されるオプションのセットを表すことです(例えば、 'JComboBox')。私の最初の勾配は、ユーザーにローカライズされた表示名を提供するために 'toString'をオーバーライドすることでしたが、javadocはより優れた「プログラマーフレンドリーな」文字列形式を得るためにオーバーライドのみを提案しました。 「ユーザーフレンドリーな」フォーム。しかし、 'name()'のjavadocのコメントは 'toString()'は* user *に親切な名前を返すように設計されているので、 'toString'のjavadocは同じ"ユーザーフレンドリー "代わりに。 –

答えて

1

ここでは、「望ましい」という言葉の意味に関して単に混乱があると思います。 javadocは基本的に同じことを2回言います:toString()をオーバーライドすることは一般にenumが動作するためには必要ではないため、そうすることは有用ではありません。

は、以下の場合にtoString()をオーバーライドすることをお勧めします。A)列挙型の文字列表現を表示する必要がないことがわかっている、またはB)デフォルトの文字列これが必要な場合は列挙を識別するのに十分です。

+0

私はネイティブの英語話者ではありません。あなたの説明は意味をなさないでしょう。 – assylias

+0

はい、私はそれをより明確にするために、 "望ましい"を "推奨"という言葉に置き換えることができると思います。 – Seth

3

列挙型では、特定の定数値があります。その列挙に対してtoStringメソッドが呼び出されると、通常は名前が返されると予想されるため、toStringメソッドを上書きすると予期しない結果が返されます。

+1

彼らが望ましくないと言ったとき、おそらく「あなたは本当にこれをしてはいけない」という意味ではなく、「本当に良い理由があるかどうかは、もう一度やめてください。それはすべて、クライアントに最も混乱の少ない行動を提供することになります。 – jpm

+2

実際に宣言されているenum値の名前を取得したい場合は、toStringではなくnameを呼び出します。 – assylias

+1

ええ、いずれかを行うことができますが、toStringはデフォルトでnameになっているので、ほとんどの場合、名前が戻り値になると予想されます。特に、列挙型のポイント全体が一定の値を持つためです。名前を直接呼び出すことで、期待通りの結果を得ることができます。別の書式などが必要な場合は、toStringを確実に上書きできます。 – Seth

2

あなたの列挙型が名前だけよりも複雑な場合(例:それらにプライベートフィールドが含まれている場合は、toSting()をオーバーライドしてこれらを表示し、列挙型フィールドの説明だけを '名前'よりも詳しく説明できます。

+1

私の質問は反対です:なぜあなたが描写したことをすることは望ましくないのでしょうか? – assylias

+0

ドキュメントでは、**通常は**が必要ではないと言っているので、enumに複雑な構造を持たない限り、必要ではありません。私は文書作成者が「あなたは上書きしてはいけない、それは悪い考えです」と感じているわけではありません。 –

関連する問題