我对构造函数有些怀疑。
有一个类“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类中使用,比如日历,即使没有在构造函数中使用)。
请您评论这三个选项,以强调它们的缺点,因为我很确定它们不是一个好的解决方案..
答案 0 :(得分:7)
使用方法1,但使用枚举而不是int。你甚至可以在课堂中内联枚举,只需将其公开为静态。
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 :(得分:0)
你是否真的有三个Young,Adult和Old类,所有这些类都可以实现一个通用接口或扩展一个抽象类来将它们绑在一起?
在父抽象类中创建一个静态工厂方法,该方法创建了所需子类的对象并将其返回?你为什么不想做三节课?它们将从父类的引用类型引用,因此它们“看起来”就像是同一个类。