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来设定队列长度