默认情况下,将Java ENUM打印为小写,保持枚举常量为大写

spa*_*ker 18 java enums

我在JAVA中有一个ENUM我想序列化,所以当我从代码中的任何地方调用它时,我得到名称的小写表示.

假设我有以下枚举:

public enum Status {
    DRAFT, PENDING, COMPLETE;
}
println ("Status=" + Status.DRAFT);
Run Code Online (Sandbox Code Playgroud)

我想得到以下内容:

Status=draft
Run Code Online (Sandbox Code Playgroud)

[注意]:我想以大写形式使用枚举常量,并在请求值时获取小写表示.

spa*_*ker 43

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

解决方案很简单,只需覆盖Enum toString方法,如下所示:

public enum Status {
    DRAFT, PENDING, COMPLETE;

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

这将以小写形式输出名称.

  • 这不是一个非常好的解决方案(尽管有upvotes),因为现在`toString()`和`name()`不再返回相同的值.没错,它并没有说出他们应该做的任何地方,但这是他们的默认行为.此外,通过重写`toString()`,您只能捕获代码使用,例如在您的示例中 - 它是一种隐式契约.那不是简洁的设计.因为你不能覆盖`name()`我宁愿提供像`lowerCaseName()`这样的新方法. (8认同)
  • 正如在这篇文章中明确指出的那样,name()实际上是返回声明的枚举的原始名称,它被标记为final,并且开发人员知道它不会被覆盖,而toString()被用于(甚至鼓励)使用返回一个"友好"的名称,所以这个用法似乎符合建议 - http://stackoverflow.com/questions/18031125/what-is-the-difference-between-enum-name-and-enum-tostring (8认同)
  • 这绝对是一种干净的方式,否则toString不会被覆盖,它对我来说是预期的.我不想在代码中使用新方法lowerCase,我想直接获得小写值.只是开发人员的偏好问题. (4认同)
  • toString在所有对象上都是可覆盖的,这不会使您的使用适当.我必须同意Marcel,事实上,因为你似乎想要枚举中的可读标签,所以你应该放入一个getLabel()方法.然后你有一个定义良好的方法,具有明确定义的返回值.toString()既不是这些东西,也只是在一些非常有限的情况下以这种方式使用,其中对象值具有事实上的标准格式,如Integer,Boolean和String.除了这些少数边缘情况,你不应该依赖于toString()的输出. (2认同)

Lor*_*uto 11

另一个解决方案是:

public enum Status {
  DRAFT, PENDING, COMPLETE;

  public String nameLowerCase(){
        return name().toLowerCase();
    }
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*rey 6

如果你想要小写,你可以使用小写,或混合大小写,或任何更有意义的你.

public enum Status {
    draft, pending, complete;
}

println ("Status=" + Status.draft);
Run Code Online (Sandbox Code Playgroud)

版画

Status=draft
Run Code Online (Sandbox Code Playgroud)