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

问题描述 投票:1回答:2

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

主类负责读取用户输入(使用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
    }
}
java nullpointerexception default-constructor object-reference object-initialization
2个回答
2
投票

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

一旦我们谈论玩家,就会变得很清楚:一个Player对象可能应该模拟(人类或非人类)玩家。没有人“没有”姓名或年龄。这告诉你:错误的做法。你的课程和模特应该反映现实。

您不需要预先创建空对象;你在那个有意义的时间点创建它们(然后你向它们提供必要的信息,这样你就可以通过声明所有的字段都是最终的来理想地使对象不可变)。

所以,长话短说:退一步重新思考你的设计。如果有“要做”的事情不需要存在填充的Player对象,那么那应该是静态方法,它可能不应该在Player类上。


2
投票

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

问题是那些方法通常需要对象的状态才有意义(即要初始化的字段)。如果在你的情况下他们没有,也许使用方法static(并调用ClassC.methodC())或者将这些方法放在其他具有默认构造函数的类上更有意义。

© www.soinside.com 2019 - 2024. All rights reserved.