我对构造函数有一些疑问。
有一个类“Foo”,可以以三种不同的“状态”创建,我们可以将它们称为“年轻”、“成人”和“老”。
我想强调的是,它们不能被视为不同的类,因为对象会进化,如果它被创建为“YOUNG”,它将变成“ADULT”,然后是“OLD”等等。
我的问题是:如何定义一个或多个构造函数以使这三种类型多样化?
我看到了一些可能性,但没有一个是“优雅”的解决方案..
1) 创建一个以 int 作为输入的构造函数
public Foo(int i)
{
switch (i)
{
case 0:
.
.
.
case 1:
.
.
.
case 2:
.
.
.
}
}
但我不喜欢它,因为如果其他人看到这段代码,就不太清楚理解。
2) 创建一个空白构造函数,然后创建三个不同的方法,例如
public Foo()
{
}
public void setYoungFoo()
{
.
.
.
}
public void setAdultFoo()
{
.
.
.
}
public void setOldFoo()
{
.
.
.
}
这可能是解决问题的明确方法,但我会在构造函数中解决这个问题..
3)静态变量在这种情况下有用吗?
public static final String "YOUNG";
public static final String "ADULT";
public static final String "OLD";
public Foo(String field)
{
}
我不知道如何填充这个构造函数,因为我从未使用过静态最终变量(我见过它们在一些 Java 类(如 Calendar)中使用,即使它们没有在构造函数中使用)。
您能否评论一下这三个选项,强调它们的缺点,因为我很确定它们不是一个好的解决方案。
最佳答案
使用方法 1,但使用枚举而不是整数。您甚至可以在类中内联枚举,只需将其设为公共(public)静态即可。
class Foo {
public static enum fooState {
young, adult, old;
}
public Foo(fooState i) {
switch(i) {
case young: ... break;
case adult: ... break;
case old: ... break;
default: throw new InvalidStateException();
}
...
}
编辑:您询问了对 3 个选项的意见,这是我的:
- 从技术上讲,选项 1 与我的版本相同,但使用了魔数(Magic Number)(即没有指定名称的数字),这使得它更难以理解(无论是对于其他人还是对于 future 的自己)
- 选项 2 在对象创建和调用 set*Foo() 之间使类处于未定义甚至无效状态。如果您可以随时过渡到年轻/成人/老年,则可以选择将对象设置为例如构造函数中的年轻状态并让用户使用已经必需的功能切换到另一个状态。取决于具体情况,这是否是一个好的选择,但它是一个有效的选择。
- 选项 3 与选项 1 基本相同,只是速度较慢,因为它涉及字符串比较。如果您调用“new Foo(Foo.YOUNG)”,代码会更容易阅读,但必须以这种方式编写代码并不直观。此外,还可以编写“new Foo("Alligator")”,这在最好的情况下会产生运行时错误。
关于java - Java 类中的多个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14531247/