1. ホーム
  2. java

[解決済み] Enum.name()`と`Enum.toString()`の違いは何ですか?[重複]です。

2022-04-23 15:29:26

質問

のドキュメントを読んだ後 String java.lang.Enum.name() を使うタイミングがよくわかりません。 名前() を使用する場合と toString() .

この関数は、この enum 定数の名前を enum 宣言で宣言されたとおりに返します。ほとんどのプログラマは、このメソッドよりも toString メソッドを優先して使用すべきです。このメソッドは、主にリリースごとに異なることのない正確な名前を取得することが重要な特殊な状況で使用するために設計されています。

特に、ドキュメントでは toString() は、Java自身の 標準ロケーション 列挙では name というのは、ドキュメントではそうなっていないと思っていたのに。

public String getName() { return name(); }

さらに Enum を実装しています。 toString() としています。

public String toString() {
    return name;
}

で、ユーザー定義の列挙が上書きされる状況は考えられません。 toString() だから name()toString() はほぼ完全に同じです。

  1. なぜ、ドキュメントを無視して、常に name() は良くないのでしょうか?
  2. リリースごとに異なることはない」という表現はどうでしょうか。名前が変わらないということは、次のことを意味するのでしょうか? java.lang.Enum.toString() となりますか?

どのように解決するのですか?

との主な違いは name()toString() は、その name()final メソッドなので、オーバーライドできません。そのため toString() と同じ値を返します。 name() はデフォルトでそうなっていますが toString() はEnumのサブクラスでオーバーライドすることができます。

したがって、もし フィールド名そのもの を使用します。 name() . もし フィールドの値を文字列で表現したもの を使用します。 toString() .

例えば

public enum WeekDay {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;

    public String toString() {
        return name().charAt(0) + name().substring(1).toLowerCase();
    }
}

この例では WeekDay.MONDAY.name() は "MONDAY"を返します。 WeekDay.MONDAY.toString() は "Monday"を返します。

WeekDay.valueOf(WeekDay.MONDAY.name()) リターン WeekDay.MONDAY しかし WeekDay.valueOf(WeekDay.MONDAY.toString()) を投げます。 IllegalArgumentException .