Java类中的多个构造函数

Ikk*_*kki 0 java constructor static-members

我对构造函数有些怀疑.

有一个类"Foo"可以在三种不同的"状态"中创建,我们称之为"年轻","成人"和"老".

我想强调它们不能被视为不同的类,因为对象将进化,如果它被创建为"YOUNG",它将变为"ADULT"然后"OLD"等等.

我的问题是:我如何定义一个或多个构造函数来使这三种类型变得多样化?

我看到了一些可能性,但没有人是一个"优雅"的解决方案..

1)创建一个以int作为输入的构造函数

public Foo(int i)
{
    switch (i)
    {
         case 0:
         .
         .
         .
         case 1:
         .
         .
         .
         case 2:
         .
         .
         .
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不喜欢它,因为不清楚是否有人看到这个代码.

2)创建一个空白构造函数,然后创建三个不同的方法,如

public Foo()
{

}

public void setYoungFoo()
{
    .
    .
    .
}

public void setAdultFoo()
{
    .
    .
    .
}

public void setOldFoo()
{
    .
    .
    .
}
Run Code Online (Sandbox Code Playgroud)

这可能是解决问题的明确方法,但我会在构造函数中解决此问题.

3)静态变量在这种情况下有用吗?

public static final String "YOUNG";
public static final String "ADULT";
public static final String "OLD";


public Foo(String field)
{

}
Run Code Online (Sandbox Code Playgroud)

我不知道如何填充这个构造函数,因为我从未使用过静态的最终变量(我已经看到它们在一些Java类中使用,比如Calendar,即使没有在构造函数中使用).

你能不能评论这三个选项,强调它们的缺点什么,因为我很确定它们不是一个好的解决方案.

Jan*_*ese 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();
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

编辑:你问了3个选项的意见,这是我的:

  1. 选项1在技术上与我的版本相同,但使用幻数(即没有指定名称的数字),这使得它更难理解(对于其他人和未来的自我)
  2. 选项2使类在Object创建和set*Foo()调用之间处于未定义或甚至无效状态.如果您可以随时转换为Young/Adult/Old,则可以选择在构造函数中将Object设置为Young状态,并让用户使用已经必需的函数切换到另一个状态.如果这是一个很好的选择,取决于情况,但它是有效的.
  3. 选项3与选项1基本相同,只是速度较慢,因为它涉及字符串比较.如果你调用"new Foo(Foo.YOUNG)",代码更容易阅读,但是你必须以这种方式编写它是不直观的.此外,可以编写"new Foo("Alligator")",这将在最好的情况下创建运行时错误.