23
enum generalInformation {
    NAME {
        @Override
        public String toString() {
            return "Name";
        }
    },
    EDUCATION {
        @Override
        public String toString() {
            return "Education";
        }
    },
    EMAIL {
        @Override
        public String toString() {
            return "Email";
        }
    },
    PROFESSION {
        @Override
        public String toString() {
            return "Profession";
        }
    },
    PHONE {
        @Override
        public String toString() {
            return "Phone";
        }
    }
}

その情報は列挙型で入手できます。

  1. 次のようなすべての列挙値を出力する方法: print.generalInformation?

その出力:

名前
学歴
Eメール
電話番号

  1. その列挙generalInformation型を別の関数の引数として渡す方法は?
4

6 に答える 6

38
System.out.println(java.util.Arrays.asList(generalInformation.values()));

interfaceあなたの2番目の部分...またはと同じclass

于 2013-01-19T10:56:51.620 に答える
15

まず、列挙型をリファクタリングして、コンストラクター パラメーターで文字列表現を渡します。そのコードは一番下にあります。

ここで、すべての列挙値を出力するには、次のようなものを使用します。

// Note: enum name changed to comply with Java naming conventions
for (GeneralInformation info : EnumSet.allOf(GeneralInformation.class)) {
    System.out.println(info);
}

を使用する代わりに を使用EnumSetすることもGeneralInformation.values()できますが、これは、呼び出すたびに新しい配列を作成する必要があることを意味し、無駄に感じます。確かに、呼び出しEnumSet.allOfには毎回新しいオブジェクトも必要です...これを頻繁に行っていパフォーマンスが心配な場合は、いつでもどこかにキャッシュできます。

GeneralInformationパラメータに関しては、他のタイプと同じように使用できます。

public void doSomething(GeneralInformation info) {
    // Whatever
}

値で呼び出されます。

doSomething(GeneralInformation.PHONE);

コンストラクター パラメーターを使用したリファクタリング

public enum GeneralInformation {
    NAME("Name"),
    EDUCATION("Education"),
    EMAIL("Email"),
    PROFESSION("Profession"),
    PHONE("Phone");

    private final String textRepresentation;

    private GeneralInformation(String textRepresentation) {
        this.textRepresentation = textRepresentation;
    }

    @Override public String toString() {
         return textRepresentation;
    }
}

現在の値を使用すると、実際には名前をタイトルの大文字小文字に自動的に変換することができますが、長期的にはあまり柔軟ではなく、この明示的なバージョンの方が簡単だと思います.

于 2013-01-19T10:55:41.553 に答える
5

Java 8以降、次の解決策を提案します。

public static String printAll() {
    return Stream.of(GeneralInformation.values()).
                map(GeneralInformation::name).
                collect(Collectors.joining(", "));
}
于 2016-11-10T02:49:41.930 に答える
0

アプリケーションでは、データをプレゼンテーションから分離することをお勧めします。これにより、データをさまざまなユーザーインターフェイスで使用できるようになり、データオブジェクトがより軽量になり、将来の国際化の可能性が高まります。

そのことを念頭に置いて、表示名を列挙型定数に強く結合することは避けてください。幸い、これを簡単にするクラスEnumMapがあります。

public class ApplicationUI {
    private final Map<GeneralInformation, String> names;

    public ApplicationUI() {
        names = new EnumMap<>(GeneralInformation.class);

        names.put(GeneralInformation.NAME,       "Name");
        names.put(GeneralInformation.EDUCATION,  "Education");
        names.put(GeneralInformation.EMAIL,      "Email");
        names.put(GeneralInformation.PROFESSION, "Profession");
        names.put(GeneralInformation.PHONE,      "Phone");

        assert names.keySet().containsAll(
            EnumSet.allOf(GeneralInformation.class)) :
            "Forgot to add one or more GeneralInformation names";
    }

    public String getNameFor(GeneralInformation info) {
        return names.get(info);
    }
}
于 2013-01-19T12:42:41.163 に答える