首页 > 解决方案 > 将枚举值与类字段匹配

问题描述

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

枚举类:

public enum MyEnum
{
   FIELD1,
   FIELD2,
   FIELD3,
   ...
}

POJO类:

public class MyPojo
{
   private String field1;
   private String field2_not_ref;
   private String field3;
   ...
}

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

public String matchMethod(MyEnum myenum)
{
  switch(myenum)
  {
   case FIELD1:
      return field1;
   case FIELD2:
      return field2_not_ref;
    ...
  }
}

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

标签: javaoopjava-8enumsswitch-statement

解决方案


与在枚举上定义方法相比,为了避免反射,这可能会很慢并使事情更简洁,您可以创建一个枚举,其字段是一个消耗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;
    }
}

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

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

如果您不想将其用作Function带有方法的变量apply,则可以在 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); }
}

并像这样调用它:

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

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


推荐阅读