【问题标题】:Java enum - custom namesJava 枚举 - 自定义名称
【发布时间】:2014-04-01 11:35:08
【问题描述】:

我想要一个 Java 枚举,其值为整数。

例如:

public enum TaskStatus {
    TaskCreated(1), 
    TaskDeleted(2)    
}

但我也想要这两个常量的自定义名称,例如
例如“任务已创建”和“任务已删除”(有空格)。
我想尽可能优雅地做到不写
太多的附加代码。

我可以在没有附加地图的情况下实现这一目标吗
将枚举常量映射到它们的自定义名称?

我在这个项目中使用的是 JDK 6。

【问题讨论】:

  • 顺便说一下,Java 中命名常量的约定是在单词之间使用全大写和下划线。所以TaskStatusTASK_CREATED & TASK_DELETED

标签: java enums


【解决方案1】:

只需为此添加一个字段:

public enum TaskStatus {
    TaskCreated(1, "Task Created"), 
    TaskDeleted(2, "Task Deleted");

    private final int value;
    private final String description;

    private TaskStatus(int value, String description) {
        this.value = value;
        this.description = description;
    }

    // Getters etc

    // Consider overriding toString to return the description
}

如果您不想指定字符串,而只想在每个大写字母前添加一个空格,这也是可行的——但出于简单和灵活的考虑,我个人会坚持使用上述方法。 (它将描述与标识符分开。)

当然,如果您想要 i18n,您可能应该只使用枚举值名称作为资源文件的键。

【讨论】:

  • 您可能希望覆盖 toString() 方法作为返回漂亮字符串值的合适位置。
  • @Duncan:谢谢,将其添加为评论以供考虑。
  • 谢谢。我会试试这个,似乎正是我需要的。
【解决方案2】:

一个简约的答案。 如果序数值足够,你可以不用。

public enum TaskStatus {
    None,
    TaskCreated, 
    TaskDeleted;

    @Override
    public String toString() {
        // Replace upper-case with a space in front, remove the first space.
        return super.toString()
            .replaceAll("\\p{U}", " $0")
            .replaceFirst("^ ", "");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多