【问题标题】:Java: Alternative to declaring empty constructor to initialize an object from another classJava:替代声明空构造函数以从另一个类初始化对象
【发布时间】:2019-02-23 09:40:26
【问题描述】:

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

主类负责读取用户输入(使用 Scanner 对象)。然后,用户输入作为参数传递给 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
    }
}

【问题讨论】:

  • 如果您将methodC() 设置为ClassC 静态,那么您不需要初始化类来调用该方法。由ClassC.methodC() 完成。但是,这限制了您可以在 ClassC 的实例中使用的内容。

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


【解决方案1】:

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

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

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

所以,长话短说:退后一步,重新考虑您的设计。如果有“某事”不需要存在填充的 Player 对象,那么这可能应该是 static 方法 并且它应该可能 不是 坐在 Player 类上。

【讨论】:

  • 感谢您提供非常丰富的答案!问题是我必须在某些类中有某些方法,除非有动机,否则我真的不允许使用静态方法。而且我认为我不能激励大多数方法都是静态的。所以基本上只有两个选择是保持原样,这意味着设计不反映现实,或者使大多数方法静态?
  • 如果没有更多上下文,这很难说。我们必须看看这些其他方法到底在做什么,才能知道它们适合什么地方。顺便说一句:欢迎投票特权:-)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-08
    • 2013-06-04
    • 2019-06-24
    • 1970-01-01
    • 2023-02-02
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多