Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java类中的多个构造函数_Java_Constructor_Static Members - Fatal编程技术网

Java类中的多个构造函数

Java类中的多个构造函数,java,constructor,static-members,Java,Constructor,Static Members,我对构造器有些怀疑 有一个类Foo可以创建为三种不同的状态,我们可以称之为年轻、成人和老年 我想强调的是,它们不能被视为不同的类,因为对象会进化,如果它是在年轻时创建的,那么它会变成成人,然后变老,等等 我的问题是:如何定义一个或多个构造函数以使这三种类型多样化 我看到了一些可能性,但没有一个是完美的解决方案 1创建一个以int作为输入的构造函数 public Foo(int i) { switch (i) { case 0: .

我对构造器有些怀疑

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

我想强调的是,它们不能被视为不同的类,因为对象会进化,如果它是在年轻时创建的,那么它会变成成人,然后变老,等等

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

我看到了一些可能性,但没有一个是完美的解决方案

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)
{

}
我不知道如何填充这个构造函数,因为我从来没有使用过静态的final变量,我在一些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在技术上与我的版本相同,但使用了魔法数字,即没有指定名称的数字,这使得其他人和你未来的自己都很难理解 选项2使类在对象创建和set*Foo调用之间处于未定义甚至无效的状态。如果您可以随时转换为Young/成人/Old,则可以选择在构造函数中将对象设置为Young状态,并允许用户使用已经必需的函数切换到另一个状态。视情况而定,如果这是一个好的选择,但这是一个有效的选择。 选项3与选项1基本相同,只是速度较慢,因为它涉及字符串比较。如果您调用new FooFoo.YOUNG,代码更容易阅读,但是必须这样编写代码并不直观。此外,还可以编写新的FooAlligator,这在最好的情况下会创建一个运行时错误。
您是否应该为年轻人、成年人和老年人提供三个类,并且所有这些类都可以实现一个公共接口或扩展一个抽象类来将它们联系在一起


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

构造函数不是方法,反之亦然。构造函数应该是自包含的。他们可以在类外调用方法,但在构造函数中调用类方法没有意义,因为类直到从构造函数返回时才存在。这也是完全错误的代码,你混淆了方法和构造函数,因此给我的印象是你不理解类和对象的概念。您应该从java基础知识和面向对象编程开始。@KevinDTimm我在构造函数中没有使用过的方法,这三种可能性都没有。@fork ok我编辑我的问题以更正它。同意。虽然使用枚举和选项3类似,但这三个选项中最好的选项是。@Aurand True,但它比选项3更不容易出错,而且整数比较比字符串比较更快。@Jennis Froese是一个很好的解决方案。只有一个澄清:用这个类创建enum类是否有用?现在不是,但将来可以在其他类中使用此枚举,或者将其创建为inner枚举有一些优点?如果在其他地方使用,内部公共静态枚举只会减少文件数。另外,如果其他人阅读了您的类的代码,他可能希望看到该枚举的代码,那么为什么不将其放在那里呢。但除此之外,没有任何优势,你可以认为这是一种比较好的风格。通过上次编辑,您已获得接受的答案!:我不想创建三个类,即使所有子类都是同一父类,因为它们只是一个类的三个状态。你可以想象这个阶级就像一个阶级的人,年轻人、成年人和老年人的地位都与他的年龄有关。如果我创造了一个年轻人,我必须以某种方式设置一些特征,但是这个类会随着时间的推移而发展,它会变成成年人,然后变老,所以我认为创造三个独立的单词是概念上的错误。你可以用作文。为一个人创建一个包含类,然后在其中包含年轻人和老年人。person类负责检查其内部的类,以确定何时应该交换,以及 年轻人、成年人和老年人都提供了帮助解决这一问题的方法。