繁体   English   中英

Java类中的多个构造函数

[英]Multiple constructors in a Java class

我对构造函数有些怀疑。

可以在三个不同的“状态”中创建一个“ Foo”类,我们可以将它们称为“ YOUNG”,“ ADULT”和“ OLD”。

我要强调的是,不能将它们视为不同的类,因为对象将演变,并且如果将其创建为“ 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,但使用枚举而不是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. 选项1从技术上讲与我的版本相同,但是使用了幻数(即没有指定名称的数字),这使其更难以理解(对于其他人和您将来的自我而言​​)
  2. 选项2使类在对象创建与对set * Foo()的调用之间处于未定义甚至无效的状态。 如果您可以随时转换为Young / Adult / Old,则可以选择在构造函数中将Object设置为例如Young状态,并让用户使用已经必要的功能切换到另一个状态。 这是一个不错的选择,但要视情况而定,但这是有效的选择。
  3. 选项3与选项1基本相同,只是速度较慢,因为它涉及字符串比较。 如果您调用“ new Foo(Foo.YOUNG)”,则该代码更易于阅读,但是必须以这种方式编写代码并不直观。 同样,有可能编写“ new Foo(“ Alligator”)“,这在最佳情况下会产生运行时错误。

您实际上是否应该为Young,Adult和Old创建三个类,并且它们都可以实现一个公共接口或扩展一个抽象类以将它们联系在一起?

在父抽象类中创建一个静态工厂方法,该方法创建了所需子类的对象并将其返回? 你为什么不想上三堂课? 它们将从父类的引用类型中引用,因此它们将“看起来”像同一类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM