Java 枚举初始化最佳实践

标签 java enums

我有一个关于在 Java 中处理枚举时的最佳实践的问题。假设我有一个 java 类和一个枚举类,如下所示:

public class Foo {
    private final FooEnum fooEnum;

    public Foo(FooEnum fooEnum) {
        this.fooEnum = fooEnum;
    }

    public Foo(String fooEnum) {
        this.fooEnum = FooEnum.valueOf(fooEnum);
    }
}

public enum FooEnum {
    FOO1,
    FOO2,
    FOO3
}

我的问题是:提供第二个构造函数接受字符串来初始化枚举,以便用户可以选择传递枚举或其等效字符串,这是否被认为是良好的做法?如果不是,还有什么替代方案?用户是否应该负责将字符串转换为枚举?

最佳答案

不,这样做是不好的做法:

  1. 您只是添加了可能不会使用的代码:YAGNI , 像他们说的那样。如果您确实需要获取字符串的 FooEnum,那么说 new Foo(FooEnum.valueOf(str)) 就那么糟糕吗?

  2. 如果我传入字符串“bibble”会怎样:这不是 Foo 中的问题导致抛出异常,所以不要涉及 Foo > 在这个问题中。

    通过提供 String 构造函数,您可以说“您可以向我传递任何字符串”(其中实际上有无限多个);通过提供 FooEnum 构造函数,您可以说“您可以向我传递任何 FooEnum”,其中数量非常少。因此,您大大限制了有效输入的空间;用户不会猜测有效的输入可能是什么。

替代方案:由于您的 Foo 中需要 FooEnum 的实例,因此让该类的用户传入 FooEnum 的实例.

关于Java 枚举初始化最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38207437/

相关文章:

c# - 在 WebApi 中序列化多个枚举值

python - Python 中枚举的枚举?

c++ - 枚举类型数据的运算符重载函数

java - 如何访问匿名对象内声明的字段?

java - HashMap 错误 : incompatible types

java - 在java http客户端中压缩非二进制数据

java - 卡夫卡与Java : how to re-read data

C#:枚举的默认值应该是 None 还是 Unknown?

enums - 在 cython 中包装 typedefed 枚举

java - 如何从部署为 .war 文件并在 Tomcat 5.5 中运行的 servlet 访问配置文件?