我知道你可以从构造函数中调用一个方法,但是如果可以覆盖该方法,它可能会导致以后出现问题。以下代码只是我写的一个示例,用于演示我的问题:
假设我有以下子类:
private boolean isActive;
public ChargeGun(String gameObjectID, String gameObjectName, String desc, int numberofshots, int damage, boolean isActive) {
super(gameObjectID, gameObjectName, desc, numberofshots, damage);
setAttributes(isActive);
}
public ChargeGun(String gameObjectID, String gameObjectName, int numberofshots, int damage, boolean isActive) {
super(gameObjectID, gameObjectName, numberofshots, damage);
setAttributes(isActive);
}
private final void setAttributes(boolean isActive)
{
this.isActive = isActive;
}
boolean isActive
特定于ChargeGun
,而不是任何其他枪支。鉴于我的子类中有两个构造函数,而不是两次键入isActive = true
,我可以调用private final method
来执行它吗?原因是,如果我的ChargeGun属性增长,那么我将不得不在两个构造函数中添加属性。如果我使用私有的最终方法,所有内容都设置在一个地方。这是不好的做法吗?
我无法链接ChargeGun构造函数,因为它们都调用了超类构造函数。
答案 0 :(得分:5)
无法覆盖private
方法,您也不需要将其标记final
(这也意味着它无法覆盖)。只需final
或 private
中的一个即可。但是,该方法需要稍微修改。像,
private void setAttributes(boolean isActive)
{
this.isActive = isActive;
}
您的版本始终将其设置为true
。如果那是故意的我将完全删除setter,并执行类似
private final boolean isActive = true;
这是不可变字段的声明和初始化。
答案 1 :(得分:0)
如果你需要你的setAttributes,它肯定意味着你有共同的变量总是在多个构造函数中设置相同的方式。拥有一个完整的构造函数"会更清楚吗?你拥有在setAttributes中所做的所有作业,以及你的版本的其他较短版本调用完整版本吗?
另外,你真的应该考虑使用Builder pattern来清楚地处理那些可以用许多不同方式构建的对象。如果您认为这是很多工作,只需知道IDE的某些插件(如InnerBuilder)就可以轻松生成。如果你看看语言是如何演变的,你会看到越来越多类似于构建器的api(Stream,Optional ......)。