【问题标题】:Java constructor - optional argument in a subclass constructorJava 构造函数 - 子类构造函数中的可选参数
【发布时间】:2021-03-12 17:40:22
【问题描述】:

这里的整个系统是一种图书馆。我有一个名为 Person 的超类,它有两个构造函数:一个将名字和姓氏作为单独的字符串,另一个将这些参数以及中间名的 ArrayList 用作中间名 - 这个想法是有些人没有中间名.在一个名为Member 的子类中,我希望通过传递一个空的ArrayList 来选择创建一个有或没有中间名的成员对象。我的第一个想法是这样的:

if (middleNames.size() == 0) {
    super(firstName, lastName);
} else {
    super(firstName, middleNames, lastName);
}

但我现在意识到super() 构造函数必须是子类构造函数中的第一个语句。希望您能看到我在这里尝试做的事情 - 有没有在 Member 类中编写两个构造函数的好方法?有几行代码我不想重复。

【问题讨论】:

  • 无论哪几行代码不想重复,都可以放在Person类的方法中吗?
  • 我看不出这样做的真正原因。你的超类构造函数做不同的事情吗?我的意思是,如果Person 将只有一个构造函数来检查middleNames 参数是否为空,然后自己做某些事情,这样任何子类都不会费心做同样的事情?跨度>
  • @PaulSamsotha 这对构造函数来说可以接受吗?澄清一下 - 代码行构成了构造函数的其余部分。
  • 另外,Person 构造函数可能会更好地接受Collection 而不是ArrayList(出于设计原因),并使用isEmpty() 而不是size() == 0 进行检查(出于性能原因)。
  • @fluffy - 因为(中间)名称的顺序很重要,不仅仅是任何Collection 都会这样做,它必须是定义/维护顺序的名称; List 将是通常的选择。此外,Donagh,根据 NomadMaker 的评论,请参阅“程序员相信名称的虚假”shinesolutions.com/2018/01/08/…

标签: java inheritance constructor subclass superclass


【解决方案1】:

您可以通过静态工厂方法而不是构造函数来构造 Member 实例。

class Member extends Person {
    static Member create(String firstName, List<String> middleNames, String lastName) {
        if (middleNames.isEmpty()) {
            return new Member(firstName, lastName);
        }
        return new Member(firstName, middleNames, lastName);
    }

    private Member(String firstName, String lastName) {
        super(firstName, lastName);
    }

    private Member(String firstName, List<String> middleNames, String lastName) {
        super(firstName, middleNames, lastName);
    }
}

【讨论】:

  • 我不熟悉这个概念(简报特别告诉我们使用构造函数),但我会研究一下 - 谢谢!
猜你喜欢
  • 2019-02-26
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多