Java 构造函数 - 子类构造函数中的可选参数

Posted

技术标签:

【中文标题】Java 构造函数 - 子类构造函数中的可选参数【英文标题】:Java constructor - optional argument in a subclass constructor 【发布时间】: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/… 【参考方案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);
    

【讨论】:

我不熟悉这个概念(简报特别告诉我们使用构造函数),但我会研究一下 - 谢谢!

以上是关于Java 构造函数 - 子类构造函数中的可选参数的主要内容,如果未能解决你的问题,请参考以下文章

通过Queue的构造函数的可选参数maxsize来设定队列长度

Go/可选参数中的多个构造函数?

OpenCV类VideoCapture构造函数中参数apiPreference的可选值及意义

Java构造函数

使用 requires 的可选非平凡析构函数

第五次JAVA课,java语法基础课件总结