Java:声明空构造函数以从另一个类初始化对象的替代方法

时间:2019-02-23 09:40:27

标签: java nullpointerexception default-constructor object-reference object-initialization

我正在创建一个简单的基于文本的交互式应用程序,在该应用程序中会提示用户输入。每个输入都对应一个特定的命令,该命令调用特定的方法。因为有很多方法,所以我选择在不同的类之间分配它们。因此该应用程序的工作方式如下:

主类负责读取用户输入(使用Scanner对象)。然后,将用户输入作为参数传递给类B中的方法B,该方法B确定输入对应于哪个命令。确定后,该方法将调用正确的方法,该方法可以在其他任何类中(在此示例中,在类C中为方法C)

这意味着我必须初始化对象实例,以避免出现空指针异常。我必须从中初始化对象的类之一只有一个带有参数的构造函数,但是在这种情况下,我实际上并不希望使用值初始化一个对象,而只是将其用作指向该对象的引用指针,所以我可以从该类调用方法。现在,我使用一个空的构造函数来解决此问题,但是有没有比声明一个空的构造函数更好的解决方案呢?我写了一些代码,证明了我的问题:

public class MainClass {
    ClassB classB = new ClassB();

    public void methodA {
        classB.methodB(userInput);
    }
}


public class ClassB {
    ClassC classC = new ClassC();

    public void methodB {
        classC.methodC();
    }
}


public class ClassC {
    String name;
    int age;

    public ClassC(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public ClassC() {
    }

    public void methodC() {
        // Do something
    }
}

2 个答案:

答案 0 :(得分:2)

  

但是在这种情况下,我实际上并不想初始化带有值的对象,而只是将其用作该对象的引用指针,这样我就可以从该类中调用方法

问题是这些方法通常需要对象的状态才能有意义(即要初始化的字段)。如果您不这样做,那么也许更合理的方法是使用方法static(并调用ClassC.methodC())或将这些方法放在具有默认构造函数的其他类上。

答案 1 :(得分:2)

真正的答案是:不要那样做。您会看到,如果ClassC是关于存储玩家的详细信息的,那么……首先将其称为Player(即使在编写示例时:也要使用有意义的名称,以便人们理解您的意图)。

我们一谈到玩家,就会很清楚:Player对象可能应该为(人类或非人类)玩家建模。没有名字或年龄的人。那告诉你:错误的方法。您的类和模型应该反映现实。

您不会预先创建 empty 对象;您可以在有意义的时间点创建它们(然后向它们提供必要的信息,因此理想情况下,您可以通过声明所有字段为最终字段来使对象不可变)。

因此,长话短说:退后一步,重新思考您的设计。如果要执行“某些操作”不需要存在已填充的Player对象,则该方法可能应该是 static 方法,而可能应该坐在Player类上。