【问题标题】:Mapping 2 enums with same values shared between 2 libraries映射 2 个具有相同值的枚举在 2 个库之间共享
【发布时间】:2018-01-29 13:31:40
【问题描述】:

我有 2 个具有相同值的枚举,以及一​​些使用一个枚举的方法和一些使用另一个枚举的方法。我想传递其中一种枚举类型来代替另一种。例如:

public enum Colors { RED, BLUE, GREEN }

public enum ScreenColors { RED, BLUE, GREEN }

public void myFunc(Colors color) {
    // Some code
}

// Want to call this as:
myFunc(ScreenColors.RED);

【问题讨论】:

  • 所以,确实需要在它们之间实现一些映射。既然你已经猜到了,那么你遇到了什么问题?
  • @Stultuske 除了创建映射之外还有其他方式吗?我有 3 对这样的对。将来可能会有更多。
  • 这两种类型看起来很相似,但在语法上却不匹配。除非,也许,你没有在 myFunc 方法中使用枚举,而是使用 enum.name() 或类似的东西。
  • 我需要这样做,因为其中一个枚举驻留在外部库中,我不希望我的所有代码库都依赖于它。而且我也没有在方法中使用字符串表示。您建议的那个在 IMO 代码中随处可见有点糟糕:Colors.valueof(ScreenColors.RED.toString())
  • 我什么时候提出过这个建议?无论哪种方式,要么使用 RED.name() (或类似的),要么使用映射,要么复制代码。但这是一个非常简单的事实,即 ScreenColors 和 Colors 不是同一类型。

标签: java enums


【解决方案1】:

您可以将此静态块添加到颜色枚举中

private static final Map<Colors, ScreenColors> LOOK_UP = new HashMap<>();

static {
    for (Colors value : EnumSet.allOf(Colors.class)) {
        LOOK_UP.put(value, ScreenColors.valueOf(value.name());
    }
}

public static ScreenColors forColors(Colors color) {
    return LOOK_UP.get(color);
}

那你就可以打电话了

myFunc(Colors.forColors(ScreenColors.RED));

【讨论】:

  • 一种可能性,但有风险。这意味着如果其中一个枚举获得了新颜色,那么另一个必须获得,但情况可能并非总是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2020-07-09
  • 2021-06-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多