将枚举值与类字段匹配

Sha*_*Sha 3 java oop enums switch-statement java-8

我在 JAVA 中有一个 enum 和 POJO 类。在枚举类中,每个枚举值都与 POJO 类的变量匹配......然后我想在两个类之间创建关系。

枚举类:

public enum MyEnum
{
   FIELD1,
   FIELD2,
   FIELD3,
   ...
}
Run Code Online (Sandbox Code Playgroud)

POJO类:

public class MyPojo
{
   private String field1;
   private String field2_not_ref;
   private String field3;
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后,当我尝试匹配两个类的这些字段时,我实现了如下代码:

public String matchMethod(MyEnum myenum)
{
  switch(myenum)
  {
   case FIELD1:
      return field1;
   case FIELD2:
      return field2_not_ref;
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我认为这不是一个好的/明确的解决方案。有什么建议吗?

And*_*cus 6

为了避免反射,这可能比在枚举上定义方法更慢并使事情更简洁,您可以创建一个枚举,其中包含一个函数消耗MyPojo和返回的字段String

public enum MyEnum {
    FIELD1(MyPojo::getField1),
    FIELD2(MyPojo::getField2),
    FIELD3(MyPojo::getField3);

    private final Function<MyPojo, String> getField;

    MyEnum(Function<MyPojo, String> getField) {
        this.getField = getField;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以通过以下方式调用它:

public static void main(String[] args) {
    MyPojo myPojo = new MyPojo("f1", "f2", "f3");
    System.out.println(MyEnum.FIELD2.getGetField().apply(myPojo));
}
Run Code Online (Sandbox Code Playgroud)

如果您不想将它用作Function带有apply方法的变量,您可以在 en enum 上创建一个函数,这样做:

public enum MyEnum {
    FIELD1(MyPojo::getField1),
    FIELD2(MyPojo::getField2),
    FIELD3(MyPojo::getField3);

    private final Function<MyPojo, String> getField;

    MyEnum(Function<MyPojo, String> getField) {
        this.getField = getField;
    }

    String getFieldFromMyPojo(MyPojo myPojo) { return getField.apply(myPojo); }
}
Run Code Online (Sandbox Code Playgroud)

并像这样调用它:

public static void main(String[] args) {
    MyPojo myPojo = new MyPojo("f1", "f2", "f3");
    System.out.println(MyEnum.FIELD2.getFieldFromMyPojo(myPojo));
}
Run Code Online (Sandbox Code Playgroud)

为简洁起见,省略了 getter 和 setter。