我在处理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
}
我的问题是:提供第二个构造函数是否是一个好的做法,它接受一个字符串来初始化枚举,以便用户可以选择传递枚举或它的字符串等效?如果没有,有什么替代方案?用户是否应负责将字符串转换为枚举?
答案 0 :(得分:8)
不,这样做是不好的做法:
FooEnum
字符串,那说new Foo(FooEnum.valueOf(str))
是不是很糟糕?如果我传入字符串" bibble"怎么办?Foo
中的问题不会导致异常被抛出,所以不要在这个问题中涉及Foo
。
通过提供String
构造函数,你就是说"你可以传递给我任何字符串" (实际上有无数的);通过提供一个FooEnum
构造函数,你就是说"你可以传递给我任何FooEnum
",其数量非常少。因此,您要大幅限制有效输入的空间;并且用户不会猜测有效输入可能是什么。
备选方案:由于您需要FooEnum
中的Foo
实例,请让该类用户在FooEnum
的实例中传递。