【发布时间】:2018-10-13 09:38:22
【问题描述】:
构造函数也可以像任何其他方法一样被重载,我知道这一事实。由于一项任务,我决定使用具有多个构造函数的抽象超类:
抽象超类:
protected ListSortierer()
{
this( null, null );
}
protected ListSortierer( List<E> li )
{
this( li, null );
}
protected ListSortierer( Comparator<E> comp )
{
this( null, comp );
}
protected ListSortierer( List<E> li, Comparator<E> com )
{
this.original = Optional.ofNullable( li );
this.comp = Optional.ofNullable( com );
}
要访问这些构造函数中的每一个,我还需要子类中的多个构造函数。
BubbleSort.java:
public ListBubbleSort()
{
super();
}
public ListBubbleSort( List<E> li )
{
super( li );
}
public ListBubbleSort( Comparator<E> com )
{
super( com );
}
public ListBubbleSort( List<E> li, Comparator<E> com )
{
super( li, com );
}
在这种情况下,子类的每个构造函数都会立即调用超类的构造函数。我想到我可以再次引用自己的构造函数并传递null值:
public ListBubbleSort()
{
this( null, null );
}
public ListBubbleSort( List<E> li )
{
this( li, null );
}
public ListBubbleSort( Comparator<E> com )
{
this( null, com );
}
public ListBubbleSort( List<E> li, Comparator<E> com )
{
super( li, com );
}
这样做可以让我省略抽象超类中的 3 个重载构造函数,但会强制每个子类遵循相同的模式。
我的问题是:在一致性的情况下,更好的方法是什么?处理抽象超类或子类中的缺失值?它对实例化有影响还是只是意见问题?
【问题讨论】:
-
当然,这是主观意见。从干净的代码和没有不必要的重复的角度来看,超类中只有一个构造函数。无论如何,子类中都需要有多个构造函数,而超类不能由客户端代码直接构造。
-
我的建议是使用构建器模式为您构建
ListBubbleSort实例。 -
@xxxvodnikxxx 你可能是对的,这个问题也适合Code Review,但我显然想知道关于实例化是否有任何技术影响。关于公约。这不仅是我公司的风格,也是所谓的Allman convention,在java中并不少见。
-
@StephenC 强烈不同意。无论如何,您发布的两篇文章似乎在很大程度上攻击了一个稻草人。
标签: java inheritance constructor instance superclass