[英]How to pass enum as an argument in a method in java?
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命名約定。 枚舉是類,應該以大寫字母開頭(例如, 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關於如何將單個枚舉常量傳遞給函數的答案。 如果您不知道枚舉和枚舉常量之間的區別是什么,請查看有關枚舉的文檔 ...
我明白你想要的是有一個打印(或任何其他)函數,你可以傳遞任何可能的枚舉,打印每個枚舉的可能值(即常量)。 我發現以下兩種方法可以做到這一點:
讓我們說我們有以下枚舉:
// 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對象(靜態枚舉,不僅是它的常量)在你的功能中,所以我已經提到了它的完整性。
TestEnumMain.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;
}
}
}
}
DummyEnum.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);
La claseenumsería
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;
}
}
Este seria el junitest para la prueba
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());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.