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

Java: Alternative to declaring empty constructor to initialize an object from another class

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

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

这意味着我必须初始化对象实例以避免空指针异常。我必须从中初始化对象的 classes 之一只有一个带参数的构造函数,但在这种情况下我实际上不想用值初始化一个对象,而只是将它用作引用指针到对象,这样我就可以从那个 class 调用方法。现在我正在使用一个空的构造函数来解决这个问题,但是有没有比声明一个空的构造函数更好的替代方案呢?我编写了我认为可以证明我的问题的代码:

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
    }
}

but I don't actually want to initialize an object with values in this case, but only to use it as a reference pointer to the object so I can invoke methods from that class

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

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

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

您没有预先创建 对象;您在有意义的那个时间点创建它们(然后您向它们提供必要的信息,因此您可以通过将所有字段声明为 final 来理想地使对象不可变)。

所以,长话短说:退后一步,重新考虑您的设计。如果有 "something" 不需要存在填充的 Player 对象,那么可能应该是 static 方法 and 它应该 坐在播放器上 class。