【问题标题】:Generate Java class from enum [closed]从枚举生成Java类[关闭]
【发布时间】:2021-07-11 08:18:39
【问题描述】:

我面临下一个问题:

我在 BE 端有属性,可以通过处理程序获取和设置。我使用枚举来设置属性,并使用 bean 类来获取。现在我需要重复属性名称,我想避免它。

public enum ExampleEnum {

    APPLE("_apple"),
    PEAR("_pear"),
    PINEAPPLE("_pineapple");

    private final String name;

    ExampleEnum(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }
}

@Data
@With
@AllArgsConstructor
public class EnumBean {

    @SerializedName("_apple")
    String apple;
    @SerializedName("_pear")
    String pear;
    @SerializedName("_pineapple")
    String pineapple;

}

public interface PropertiesService {

    EnumBean getPropertiesViaBE();
    void setPropertyViaBE(ExampleEnum property, String value);

}

现在我必须支持这些类之间的两种方式的一致性。

【问题讨论】:

标签: java


【解决方案1】:

我不确定这是你想要达到的目标,但我猜:

您想要返回一个 json 对象,该对象基本上包含 name 属性到枚举名称的映射,例如像这样:

{
   "_apple": "APPLE",
   "_pear": "PEAR",
   "_pineapple":"PINEAPPLE"
}

在旁注中,我不确定您为什么需要它,因为一个简单的列表可能足以获得可用的枚举,但也许我猜错了,您需要添加更多信息。在任何情况下,您都可以在以下基础上进行构建。

要生成像上面这样的 json 字符串,您不需要 POJO。大多数 json 生成器和解析器都支持泛型类型,例如地图和收藏。因此,您可以构建一个地图:

Map<String, String> map = Arrays.stream(ExampleEnum.values())
                                .collect(Collectors.toMap(e -> e.getName(), 
                                                          e -> e.name()));

然后只需将该映射序列化为 json,您应该会得到一个类似上面的字符串。

【讨论】:

  • 我持有这个bean类用于后端响应反序列化,所以我认为我需要这个类。
  • 您也可以反序列化为Map&lt;String, String&gt;。但是,我觉得我们在这里有一个xy-problem,所以您能否编辑您的问题并详细说明您想要实现的目标?
  • 我已经更新了问题
  • @Shilko2013 你仍然可以像上面那样做,特别是如果你在内部维护该地图并将属性值用作地图值。您可能希望使用枚举作为键,在这种情况下,您的 json 框架将需要一些有关如何将枚举值映射到其名称的信息,反之亦然。所以尝试Map&lt;ExampleEnum, String&gt; getPropertiesViaBE(); 并返回一个不可变的映射,例如通过Map.copyOf(yourInternalMap).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2013-10-12
  • 2018-03-07
  • 2019-12-29
  • 2021-05-07
相关资源
最近更新 更多