【问题标题】:is it possible to define an enum with int identifiers?是否可以使用 int 标识符定义枚举?
【发布时间】:2013-11-10 01:38:44
【问题描述】:

我的问题是“枚举中是否可以有一个 int 标识符?” 我正在开发一个 java 程序,我需要包含数字和字母的标识符,但 eclips 不接受它。

例如 公共枚举标签{ 5F25, 4F, . . . }

谁知道有没有办法解决这个问题! 谢谢

【问题讨论】:

  • 您的问题是“一个以整数开始的标识符”,正如您在@GGrecs 答案中所见,在其他地方有一个 int 不是问题。
  • 是的,你是对的。谢谢

标签: java


【解决方案1】:

枚举实例必须遵守与其他标识符相同的 Java 语言命名限制 - 它们不能以数字开头。

如果您绝对必须在名称中包含十六进制,请在它们前面加上一个字母/单词,例如枚举类本身:

public enum Tag {
   Tag5F25,
   Tag4F,
   ...
}

或者可能带有下划线和全大写:

public enum Tag {
   TAG_5F25,
   TAG_4F,
   ...
}

【讨论】:

  • 我支持使用下划线作为前缀,所以用法看起来像Tag._5F25,没有冗余。不过可能需要修改 RSPEC-115 的 SonarQube 正则表达式。
【解决方案2】:

您正试图改变编程的规则和惯例。我建议你采取不同的方法。

枚举可以有构造函数。它们通常是私有的,因为枚举的“实例”是在其中创建的。您可以提供任何您想要的信息(例如 ID、姓名、关键字等)。

在此示例中,我在构造函数中仅使用一个参数实现了枚举,这是您需要的唯一 ID。

public enum Tag
{
    TAG_1(1),
    TAG_2(2),
    TAG_3(3);

    private final int id;

    private Tag(final int id)
    {
         this.id = id;
    }

    public int id() // Objective C style. Can be getId()
    {
         return id;
    }

    /**
     * Bonus method: get a Tag for a specific ID.
     *
     * e.g. Tag tagWithId2 = Tag.getTagForId(2);
     */
    public static Tag getTagForId(final int id)
    {
         for (final Tag tag : values())
              if (tag.id == id)
                   return tag;
         return null;
    }
}

【讨论】:

  • +1,我从没想过Enum会这样,C++也可以吗?
  • 查看stackoverflow.com/a/3069863/133645 了解枚举命名约定(大写)
  • @reto 写在我的脑海里,但我同意你的看法。
【解决方案3】:

总之,不。Java 枚举基本上是类型安全枚举模式的语法糖。这意味着枚举是 java 标识符的列表:它们的名称必须遵循标识符的所有规则。其中一条规则是标识符名称不能以数字开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2015-05-16
    • 2019-01-24
    相关资源
    最近更新 更多