【问题标题】:Java and naming of method to get enum from intJava和从int获取枚举的方法命名
【发布时间】:2014-06-24 08:26:26
【问题描述】:

我有一个枚举,其中每个枚举映射到一个整数,它与枚举的ordinal() 不匹配。现在我需要一种将整数转换为枚举的方法。我认为有两种选择:

  1. 具有唯一名称的新方法,例如(惯用语?):

    public static MyEnum fromInt(int i) {}
    
  2. valueOf()的重载:

    public static MyEnum valueOf(int i) {}
    

两者都还好,还是其中一个明显是坏的还是好的?

提供两者是好是坏?如果是,它们应该相同还是行为略有不同,例如如果i 不是有效值,则行为不同。

或者有没有比这两者都优越的第三种选择?

我正在寻找一个简短的答案,说明应该如何做到这一点以符合已建立的 Java 编码实践。枚举将被其他人使用并长期维护。请以某种权威的参考或丰富的经验来回答,而不是纯粹的意见或感觉更好。

另外,这个问题不是关于如何实现这个方法,它只是关于它应该如何命名,如果名称取决于确切的行为,那么与“Java 世界”的其他部分最一致。

【问题讨论】:

  • 不要重载 valueOf() - 它会混淆人类。工厂方法是要走的路。

标签: java enums type-conversion


【解决方案1】:

大概数字 意味着 什么 - 所以我会创建一个使用该信息的方法。例如:

public enum HttpStatus {
    OK(200),
    ...
    NOT_FOUND(404);

    private int statusCode;

    private HttpStatus(int statusCode) {
        this.statusCode = statusCode;
    }

    public static HttpStatus fromStatusCode(int statusCode) {
        ...
    }
}

只是fromInt 没有给出整数的预期含义的任何指示...而且它也不允许稍后基于int 的替代查找。

【讨论】:

  • @maress,Jon Skeet 肯定打字很快。这是乔恩·斯基特本人! :)
【解决方案2】:

意见第一:

我通常根据用途命名我的枚举工厂方法,而不仅仅是 valueOf 或任何东西。 例如,假设:

public enum Language{
 GERMAN(345),
 ENGLISH(342);

 private int isoCode;

 public static Language fromIsoCode(int isoCode){
  //do my logic here
 }
}

在这种情况下,我要准确地告诉我的图书馆用户应该将什么传递给 fromIsoCode、isocode、而不是序数或任何其他可能是枚举一部分的整数。

因此建议,重新考虑命名 fromInt 或 valueOf,并根据该整数在枚举上下文中真正表示的内容来命名。

【讨论】:

    【解决方案3】:

    我个人不喜欢fromInt(),因为它的名字并没有让读者了解这个方法的作用。 valueOf() 名称不包含附加信息,但看起来更熟悉。

    但是,如果您的 int 有某个名称,例如id,我可能更喜欢方法fromId()

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多