186

メソッドの列挙型APIを見ると、次のようにname()なっています。

enum宣言で宣言されているとおりに、このenum定数の名前を返します。toStringメソッドはよりユーザーフレンドリーな名前を返す可能性があるため、ほとんどのプログラマーはこれよりもtoStringメソッドを使用する必要があります。このメソッドは、主に、リリースごとに変わらない正確な名前を取得することに正確さが依存する特殊な状況で使用するために設計されています。

なぜ使用する方が良いのtoString()ですか?つまり、name()がすでにfinalである場合、toStringがオーバーライドされる可能性があります。したがって、toStringを使用し、誰かがそれをオーバーライドしてハードコードされた値を返す場合、アプリケーション全体がダウンしています...また、ソースを調べると、toString()メソッドは正確に名前だけを返します。それは同じことです。

4

7 に答える 7

225

それは、返された値で何をしたいかによって異なります。

  • 列挙定数を宣言するために使用される正確な名前を取得する必要がある場合は、上書きされた可能性があるname()asを使用する必要がありますtoString
  • ユーザーフレンドリーな方法で列挙型定数を出力したい場合は、toStringオーバーライドされている可能性がある (またはオーバーライドされていない!) を使用する必要があります。

混乱するかもしれないと感じた場合は、より具体的なgetXXX方法を提供します。たとえば、次のようになります。

public enum Fields {
    LAST_NAME("Last Name"), FIRST_NAME("First Name");

    private final String fieldDescription;

    private Fields(String value) {
        fieldDescription = value;
    }

    public String getFieldDescription() {
        return fieldDescription;
    }
}
于 2012-11-08T14:37:43.653 に答える
59

比較を行う場合、またはハードコードされた値をコード内で内部的に使用name()する場合に使用します。

toString()ユーザー (ログを見ている開発者を含む) に情報を提示する場合に使用します。toString()コードで特定の値を指定することに依存しないでください。特定の文字列に対してテストしないでください。誰かがtoString()リターンを正しく変更したときにコードが壊れた場合、それはすでに壊れています。

javadoc から (強調鉱山):

オブジェクトの文字列表現を返します。一般に、toString メソッドは、このオブジェクトを「テキストで表す」文字列を返します。結果は、人が読みやすい簡潔で有益な表現でなければなりません。すべてのサブクラスがこのメソッドをオーバーライドすることをお勧めします。

于 2012-11-08T14:37:37.407 に答える
27

name()の「組み込み」メソッドですenum。これは最終的なものであり、その実装を変更することはできません。列挙型定数の名前を、たとえば大文字で、スペースなどを入れずに、書かれているとおりに返します。

とを比較MOBILE_PHONE_NUMBERしてくださいMobile phone number。どちらのバージョンが読みやすいですか? 私は2番目を信じています。これが違いです。name()常にreturn MOBILE_PHONE_NUMBERtoString()return にオーバーライドされる場合がありますMobile phone number

于 2012-11-08T14:41:06.880 に答える
5

name() は文字通り、列挙型の Java コード内のテキスト名です。つまり、Java コードに実際に表示できる文字列に限定されますが、すべての望ましい文字列がコードで表現できるわけではありません。たとえば、数字で始まる文字列が必要な場合があります。name() がその文字列を取得することはできません。

于 2015-08-07T21:05:46.213 に答える