public class Enumvalues{
enum courseList {
JAVA,
C,
PYTHON,
PERL
}
enum generalInformation {
NAME,
AGE,
PHONE
}
enum sex {
MALE,
FEMALE
}
}
public static void main(String args[]) {
printEnumValue(generalInformation); // how to pass enum in this block
}
static void printEnumValue(enum generalInformation) { // how to receive enum in this block
System.out.println(java.util.Arrays.asList(generalInformation.values()));
}
7 に答える
列挙型はクラスです。したがって、クラスのインスタンスを渡すことも (EnumValues.generalInformation.PHONE
たとえば)、クラス自体を渡すこともできます (EnumValues.generalInformation.class
たとえば)。
列挙型クラスのすべてのインスタンスを一覧表示する場合は、列挙型クラスを渡し、EnumSet.allOf(EnumValues.generalInformation.class)
たとえば次のように使用する必要があります。
あなたの混乱は主に、Java の命名規則を尊重していないことに起因しています。Enum はクラスであり、大文字で始める必要があります (GeneralInformation
たとえば)。混乱のもう 1 つの原因は、名前の不適切な選択です。JAVAはコース一覧ではありません。コースです。したがって、列挙型には名前を付ける必要がありますCourse
。
あなたの質問は2つの異なる問題を混同していることに注意してください. Enumを関数に渡す OR Enum定数を関数に渡す. 私の理解では、関数に定数の1つではなく、列挙型自体を渡したいということでした。そうでない場合: 単一の列挙型定数を関数に渡す方法については、Narendra Pathai の回答を参照してください。列挙型と列挙型定数の違いがわからない場合は、列挙型に関するドキュメントを確認してください...
あなたが望むのは、列挙型の可能な値(つまり定数)のそれぞれを出力するために、可能な列挙型を渡すことができる印刷(またはその他の)関数を持つことであることを理解しています。これを行うには、次の2つのアプローチを見つけました。
次の列挙型があるとしましょう。
// The test enum, any other will work too
public static enum ETest
{
PRINT,MY,VALUES
}
バリアント 1:定数の配列を列挙型から関数に渡します。列挙型の定数は静的な値であるため、次のように簡単にアクセスして「印刷」関数に渡すことができます。
public static void main(String[] args)
{
// retreive all constants of your enum by YourEnum.values()
// then pass them to your function
printEnum(ETest.values());
}
// print function: type safe for Enum values
public static <T extends Enum<T>> void printEnum(T[] aValues)
{
System.out.println(java.util.Arrays.asList(aValues));
}
バリアント 2:列挙型のクラスを関数パラメーターとして渡します。これはより美しく見えるかもしれませんが、反射が関係していることに注意してください (パフォーマンス):
public static void main(String[] args)
{
printEnum2(ETest.class);
}
// print function: accepts enum class and prints all constants
public static <T extends Enum<T>> void printEnum2(Class<T> aEnum)
{
// retreive all constants of your enum (reflection!!)
System.out.println(java.util.Arrays.asList(aEnum.getEnumConstants()));
}
私の意見では、バリアント 2 ではリフレクションが過剰に使用されているため、バリアント 1 を使用することをお勧めします。バリアント 2 が提供する唯一の利点は、Enum 自体の Class オブジェクト (定数だけでなく静的な列挙型) を使用できることです。関数内にあるので、完全を期すために言及しました。
列挙型から単一の値を渡したい場合
public class Test {
enum GeneralInformation{
NAME;
}
private static void print(GeneralInformation val){
System.out.println(val);
}
public static void main(String[] args) {
print(GeneralInformation.NAME);
}
}
それ以外の場合は、質問から明確ではなかったので、クラス全体を通過させたい場合
private static void print(Class<?> generalInfo){
}
public static void main(String[] args) {
print(GeneralInformation.class);
}
printEnumValue(EnumValues.generalInformation.NAME,EnumValues.generalInformation.AGE,EnumValues.generalInformation.PHONE);
受信:
public static void printEnumValue(EnumValues.generalInformation en){
System.out.println(en.toString());
}
列挙型は型と同じように使用されます。
static void printEnumValue(courseList generalInformation) { // how to receive enum in this block
次のように使用されます:
printEnumValue(courseList.JAVA);