【问题标题】:Java - enum valueOf "override" naming conventionJava - 枚举值“覆盖”命名约定
【发布时间】:2013-10-03 07:43:40
【问题描述】:

假设你有以下枚举

public enum Color {
    RED("R"), GREEN("G"), BLUE("B");
    private String shortName;

    private Color(String shortName) {
        this.shortName = shortName;
    }

    public static Color getColorByName(String shortName) {
        for (Color color : Color.values()) {
            if (color.shortName.equals(shortName)) {
                return color;
            }
        }
        throw new IllegalArgumentException("Illegal color name: " + shortName);
    }
}

由于 enum 是一种特殊情况,当您不能只覆盖 valueOf 函数时,规避这一点并实现 valueOf(String name) 的命名约定是什么?

getColorByName(String name)
getValueOf(String name)
permissiveValueOf(String name)
customValueOf(String name)
forName(String name)
getEnum(String name)
getColor(String name)

后期编辑: 我在 Effective Java 2nd ed 中看到了 Bloch。在 getInstance() 行中提出了一些建议(第 1 章,第 1 项)。 只是为了添加另一个选项。

【问题讨论】:

  • en.wikipedia.org/wiki/Method_overriding#Java 覆盖方法保留名称。
  • 即使重载也保持相同的名称,但会改变签名。这听起来像是我们在谈论完全不同的名字......
  • 伙计们......我们正在谈论枚举。您不能覆盖 valueOf() 和 values()。我将更改标题以指出这一点。但是请删除你的反对票并给我一个答案。
  • 让我看看我明白了:你在问如何命名一个方法,我们暂时称它为“foo”,它将得到一个字符串(“R”、“G”或“B ") 并将返回正确的 Color.RED/Color.Blue/Color.Green?
  • 正确,埃拉德。一个将完全返回的工厂方法。我不介意“foo”是惯例,但我对此表示怀疑。

标签: java enums naming-conventions value-of


【解决方案1】:

你绝对是对的,你不能覆盖Enum#valueOf(),因为它是Enum类的静态方法。

我认为没有命名约定。正如您已经指出的那样,Java 中的示例很少:

我不会使用getEnum,因为您获得的不是Enum 本身,而是一个值。 在这里使用forName() 不合适,R 不是红色的名称

我宁愿选择:

  • fromString(),因为它与toString()相反;
  • getColor() 与 Java 标准库保持一致。

【讨论】:

  • 问题是我无法在 Enum 的 Java 规范中找到任何示例。 Color 和 Class 是类而不是枚举。因此你也可以添加一个 valueOf 方法,但你不能做一个 switch(color)
  • "fromBlah" 对我来说很有意义。例如,请参阅Response.Status.fromStatusCode
  • 没有标准,也不是很常见,因此您也不太可能找到任何强大的约定。除非你想开始搞乱 cglib(!) fromString 可能是最好的。当然,没有人会在阅读时感到困惑。
  • 为什么不使用colorOf(String colorName)
【解决方案2】:

请考虑以下事项!

Color fromName(String name);
Color fromShortName(String shortName);
Color fromCode(String code);

【讨论】:

    【解决方案3】:

    我会使用这对:

    Color fromValue(String value)
    String toValue()
    

    这是我发现在我的枚举中最合适的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多