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()));
}
枚举是一个类。所以你可以传递一个类的实例(例如EnumValues.generalInformation.PHONE
),或者你可以传递类本身(例如EnumValues.generalInformation.class
)。
如果要列出枚举类的所有实例,则需要传递枚举类,并使用EnumSet.allOf(EnumValues.generalInformation.class)
作为示例。
您的困惑主要来自于您不尊重Java命名约定。 ENums是类,应该以大写字母开头(例如GeneralInformation
)。另一个混乱的来源是名称选择不当。 JAVA不是课程列表。这是一门课程。所以枚举应该命名为Course
。
如果要从枚举中传递单个值
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);
}
请注意,您的问题混淆了两个不同的问题:将枚举传递给函数或将枚举常量传递给函数。我的理解是你想要传递枚举本身,而不是它的一个常量函数。如果不是:请参阅Narendra Pathai关于如何将单个枚举常量传递给函数的答案。如果您不知道枚举和枚举常量之间的区别是什么,请查看关于枚举的docs ...
我明白你想要的是有一个打印(或任何其他)函数,你可以传递任何可能的枚举,打印每个枚举的可能值(即常量)。我发现以下两种方法可以做到这一点:
让我们说我们有以下枚举:
// The test enum, any other will work too
public static enum ETest
{
PRINT,MY,VALUES
}
Variante 1:将你的枚举中的常量数组传递给你的函数;由于枚举的常量是静态值,因此可以轻松访问它们并将其传递给“print”函数,如下所示:
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));
}
Variante 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()));
}
在我看来,最好使用variante 1,因为variante 2中反射的过度使用.Viriante 2给你的唯一优点是你有Enum本身的Class对象(静态枚举,不仅是它的常量)在你的功能中,所以我已经提到了它的完整性。
test enum main.Java:
package enumSample;
import org.apache.commons.lang3.EnumUtils;
public static void main(String[] args) {
boolean result= isValidEnum(DummyEnum.class, "APPLE");
System.out.println("result= " + result);
boolean result2= isValidEnum2(DummyEnum.class, "COF");
System.out.println("result2= " + result2);
//boolean result3= isValidEnum2(A_Different_Enum.class, "COF"); //works
//System.out.println("result3= " + result3);
}
public static<E extends Enum<E>> boolean isValidEnum2(Class<E> enumClass, String enumName) {
System.out.println("enumClass.getEnumConstants().length= " + enumClass.getEnumConstants().length);
System.out.println("enumClass.getEnumConstants()[0]= " + enumClass.getEnumConstants()[0]);
System.out.println("enumClass.getEnumConstants()[1]= " + enumClass.getEnumConstants()[1].name());
System.out.println("enumName.valueOf(enumClass)= "+ enumName.valueOf(enumClass));
if(enumName== null) {
return false;
} else {
try {
if(enumClass.isAssignableFrom(DummyEnum.class)) { /*Checks if enumClass is an instance of DummyEnum.class*/
for (int i=0; i!= enumClass.getEnumConstants().length; i++) {
System.out.println("(DummyEnum) enumClass.getEnumConstants()["+i+"]).code()= "+ ((DummyEnum) enumClass.getEnumConstants()[i]).code());
if(enumName.equals(((DummyEnum) enumClass.getEnumConstants()[i]).code())) {
return true;
}
}
return false;
} else {
Enum.valueOf(enumClass, enumName);
return true;
}
} catch (IllegalArgumentException var3){
return false;
}
}
}
//Original Method from apache.commons.long3.EnumUtils:
public static<E extends Enum<E>> boolean isValidEnum(Class<E> enumClass, String enumName) {
if(enumName== null) {
return false;
} else {
try {
Enum.valueOf(enumClass, enumName);
return true;
} catch (IllegalArgumentException var3){
return false;
}
}
}
}
dummy enum.Java:
package enumSample;
public enum DummyEnum {
APPLE("APP"),
GOOGLE("GOOG"),
CAPITAL_ONE("COF");
private String code;
DummyEnum(String code) {this.code= code;}
public String code() {return code;}
}
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);
枚举类将是
public enum LdapExceptionEnumeration {
LDAP_ATTR_NAME_CREATE_INVALIDO("3018","El nombre del atributo enviado es inválido")
String codigo;
String error;
private LdapExceptionEnumeration(String codigo, String error) {
this.codigo = codigo;
this.error = error;
}
public String getCodigo() {
return codigo;
}
public String getError() {
return error;
}
}
这将是测试的最佳时期
public class EnumTest {
@Test
public void consultaenum(){
imprimeEnum(LdapExceptionEnumeration.LDAP_ATTR_NAME_CREATE_INVALIDO);
}
public void imprimeEnum(LdapExceptionEnumeration enumClass){
System.out.println("codigo: "+ enumClass.getCodigo());
System.out.println("mensaje: "+ enumClass.getError());
}
}