簡體   English   中英

枚舉中的Java重用代碼

[英]java reuse code in enum

我有一個如下的枚舉:

public enum EOrderStatus  {

DELETE(0, "aaaa"),
CANCEL(1, "bbb"),
APPEND(2, "cccc");

private EOrderStatus(int value, String description)
{
    Description = description;
    Value = value;
}

//region common

public String getDescription() {
    return Description;
}
protected void setDescription(String description) {
    Description = description;
}
// 此枚舉的描述,此值可以用於日志顯示,或接口返回說明等
private String  Description;
public int getValue() {
    return Value;
}
protected void setValue(int value) {
    Value = value;
}
// int 值
private  int Value;

//endregion
}

我有100多個這樣的枚舉。 如何在區域和末端區域之間重用代碼? ................................................... ..........

不知道這是否是一個好習慣,但是我想說您不能真正排除變量,但是如果您願意使用反射,則可以省去重復使用這些方法的麻煩。

鑒於這些枚舉:

enum Enum1 {
  DELETE(10, "aaaa1"),
  CANCEL(11, "bbb1"),
  APPEND(12, "cccc1");

  public final String description;
  public final int value;

  private Enum1(int value, String description) {
    this.description = description;
    this.value = value;
  }
}

enum Enum2  {
  DELETE(20, "aaaa2"),
  CANCEL(21, "bbb2"),
  APPEND(22, "cccc2");

  public final String description;
  public final int value;

  private Enum2(int value, String description) {
    this.description = description;
    this.value = value;
  }
}

您可以創建一個utils類,該類使用反射讀取值:

class EnumUtils {

  public static String getDescription(Class enumClass, String enumName) {
    return (String) getFieldValue(enumClass, enumName, "description");
  }

  public static int getValue(Class enumClass, String enumName) {
    return (Integer) getFieldValue(enumClass, enumName, "value");
  }

  public static Object getFieldValue(Class enumClass, String enumName, String fieldName) {
    Object value = null;
    Enum e = Enum.valueOf(enumClass, enumName);
    try {
      Field descriptionField = e.getClass().getDeclaredField(fieldName);
      value = descriptionField.get(e);
    } catch(NoSuchFieldException | IllegalAccessException ex) { /* Handle that as you want */ }
    return value;
  }
}

然后,您可以通過以下方式使用它:

public static void main(String[] args)  {

  System.out.println(EnumUtils.getDescription(Enum1.class, "DELETE"));
  System.out.println(EnumUtils.getDescription(Enum2.class, "DELETE"));

  System.out.println(EnumUtils.getValue(Enum1.class, "CANCEL"));
  System.out.println(EnumUtils.getValue(Enum2.class, "APPEND"));

}

輸出

aaaa1
aaaa2
11
22

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM