【问题标题】:Print Java enum to lower case by default keeping enum constants in uppercase默认情况下,将 Java 枚举打印为小写,将枚举常量保持为大写
【发布时间】:2013-11-10 19:29:30
【问题描述】:

我有一个想要序列化的 Java 枚举,因此当我从代码中的任何位置调用它时,我会得到名称的小写表示。

假设我有以下枚举:

public enum Status {
    DRAFT, PENDING, COMPLETE;
}
println ("Status=" + Status.DRAFT);

我想得到以下:

Status=draft

[注意]:我想使用大写的枚举常量,并且在请求值时获取小写表示。

【问题讨论】:

  • 这不会将 Enum 序列化为小写。这将以小写形式打印其名称。
  • 只是翻译误会,英语不是我的母语,对不起。
  • 好的,没问题。我也在学习英语:)

标签: java enums


【解决方案1】:

我自己回答了这个问题,因为我发现这个解决方案很有趣,但在网站上找不到回复。以防万一其他人寻找解决此问题的方法。

解决方案很简单,只需像这样重写 Enum toString 方法:

public enum Status {
    DRAFT, PENDING, COMPLETE;

    @Override
    public String toString() {
        return name().toLowerCase();
    }
}
println ("Status=" + Status.DRAFT);

这会以小写形式输出名称。

【讨论】:

  • 这不是一个很好的解决方案(尽管有赞成票),因为现在toString()name() 不再返回相同的值。诚然,它并没有说他们应该在任何地方,但这是他们的默认行为。此外,通过覆盖toString(),您只能捕获代码使用,例如在您的示例中 - 这是一种隐式合同。那不是干净的设计。既然你不能覆盖name(),我宁愿提供一个像lowerCaseName()这样的新方法。
  • 这绝对是一种干净的方法,否则 toString 不会被覆盖,它按我的预期工作。我不想在代码中使用新方法 lowerCase,我想直接获取小写值。只是开发人员的偏好问题。
  • toString 在所有对象上都是可覆盖的,这并不适合您的使用。我必须同意 Marcel 的观点,事实上,由于您似乎想要从枚举中获取可读标签,您应该只输入一个 getLabel() 方法。然后你有一个定义明确的方法和一个明确定义的返回值。 toString() 不是这些东西,并且仅在对象值具有事实上的标准格式的极少数情况下以这种方式使用,例如 Integer、Boolean 和 String。除了这几个边缘情况,你永远不应该依赖 toString() 的输出。
  • 您可以在 Google 应用程序中找到这样的用法(即:play.google.com/store/apps/…),它们会覆盖某些对象的 toString 函数以获取所需的字符串。我再说一遍:这只是开发人员偏好的问题,只要它对我来说有据可查,它就是一个有效的解决方案。
  • 正如在这篇文章中明确指出的那样,name() 确实用于返回声明的枚举的原始名称,该名称被标记为 final,开发人员知道它不会被覆盖,而 toString() 则旨在(甚至鼓励)用于返回“友好”名称,因此这种用法似乎符合建议 - stackoverflow.com/questions/18031125/…
【解决方案2】:

另一种解决方案可能是:

public enum Status {
  DRAFT, PENDING, COMPLETE;

  public String nameLowerCase(){
        return name().toLowerCase();
    }
}

【讨论】:

    【解决方案3】:

    如果你想要小写,你可以只使用小写,或者混合大小写,或者任何对你更有意义的东西。

    public enum Status {
        draft, pending, complete;
    }
    
    println ("Status=" + Status.draft);
    

    打印

    Status=draft
    

    【讨论】:

    • 嗨,彼得,感谢您的回复,但请在下面查找我的,我通过覆盖 Enum.toString 函数解决了它。您的回答没有解决我的问题,因为我想使用大写的常量枚举,但是在请求实际值时获取小写表示。
    • 恕我直言,无论是大写还是小写都更具可读性,并且在您的输出或代码中更有意义。它确实回答了这个问题,因为您没有说您需要将常量设为大写。
    • 你是对的,我没有指定我想要大写的常量,我认为这很明显。我编辑了问题。谢谢
    【解决方案4】:

    您可以使用以下 Enum 类,其中包含每个枚举常量的名称和序号的构造函数。您可以为枚举常量分配所需的值。

    public enum Status {
    
    DRAFT(0,"draft"), PENDING(1,"pending"), COMPLETE(2,"complete");
    
    private int key;
    private String value;
    
    Status(int key, String value){
        this.key = key;
        this.value = value;
    }
    
    public int getKey() {
        return key;
    }
    
    public void setKey(int key) {
        this.key = key;
    }
    
    public String getValue() {
        return value;
    }
    
    public void setValue(String value) {
        this.value = value;
    }
    
    @Override
    public String toString(){
        return this.value;
    }
    
    }
    

    由于我们重写了toString 方法,所以返回的是小写的值。

    使用

    System.out.print("Status = "+Status.DRAFT);
    

    会打印,

    Status = draft
    

    System.out.print("Status = "+Status.DRAFT.name());
    

    会打印

    Status = DRAFT
    

    【讨论】:

    • 无需将value 存储为单独的字符串,因为您只需调用name().toLowerCase() 即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2011-07-09
    相关资源
    最近更新 更多