Java 可以从构造函数调用私有Final方法吗?

Java 可以从构造函数调用私有Final方法吗?,java,constructor,Java,Constructor,我知道您可以从构造函数调用方法,但是如果该方法可以被重写,那么以后可能会出现问题。以下代码只是我编写的一个示例,演示了我的问题: 假设我有以下子类: private boolean isActive; public ChargeGun(String gameObjectID, String gameObjectName, String desc, int numberofshots, int damage, boolean isActive) { super(gameObjectID,

我知道您可以从构造函数调用方法,但是如果该方法可以被重写,那么以后可能会出现问题。以下代码只是我编写的一个示例,演示了我的问题:

假设我有以下子类

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;
}
布尔值isActive
特定于
充电枪
,而不是任何其他枪。考虑到我的子类中有两个构造函数,而不是两次键入
isActive=true
,我可以调用
private final方法来实现它吗?原因是,如果我的ChargeGun属性增加,那么我必须在两个构造函数中添加属性。如果我用一个私有的final方法,那么所有的东西都被设置在一个地方。这是坏习惯吗


我无法链接ChargeGun构造函数,因为它们都调用超级类构造函数

A
private
方法不能被重写,您也不需要将其标记为final
(这也意味着它不能被重写)。只要一个
final
private
就足够了。但是,该方法需要稍加修改。像

private void setAttributes(boolean isActive)
{
    this.isActive = isActive;
}
您的版本总是将其设置为
true
。如果这是有意的,我会完全删除setter,并执行如下操作

private final boolean isActive = true;

它是一个不可变字段的声明和初始化。

不能重写
私有
方法,您也不需要将其标记为
最终
(这也意味着它不能被重写)。只要一个
final
private
就足够了。但是,该方法需要稍加修改。像

private void setAttributes(boolean isActive)
{
    this.isActive = isActive;
}
您的版本总是将其设置为
true
。如果这是有意的,我会完全删除setter,并执行如下操作

private final boolean isActive = true;

这是一个不可变字段的声明和初始化。

如果您需要setAttributes,这当然意味着您有公共变量,可以在多个构造函数中始终以相同的方式进行设置。如果有一个“完整构造函数”,其中包含您在setAttributes中所做的所有赋值,而其他较短版本的版本调用完整版本,这不是更清楚吗


<>也,你确实应该考虑清楚地使用那些可以用许多不同的方式构造的对象。如果你认为这是一个很大的工作,只知道一些插件的IDE,如使其易于生成。如果你看看语言是如何发展的,你会看到越来越多的类似于构建器的api(流,可选…。

如果你需要你的setAttributes,这当然意味着你有公共变量在多个构造函数中总是以相同的方式设置。如果有一个“完整构造函数”,其中包含您在setAttributes中所做的所有赋值,而其他较短版本的版本调用完整版本,这不是更清楚吗


<>也,你确实应该考虑清楚地使用那些可以用许多不同的方式构造的对象。如果你认为这是一个很大的工作,只知道一些插件的IDE,如使其易于生成。如果你看看语言是如何发展的,你会看到越来越多的类似于构建器的api(流,可选…。

这种方法没有用,你应该直接内联它。还要注意,第二个构造函数非常奇怪,因为它的结尾是
this.isActive=this.isActive
@Elliot,这是一个错误,你的版本是correct@RC-抱歉,内联是什么意思?内联=删除它并将其“内容”放在原来的位置called@RC-如果我的ChargeGun grow属性使用的是私有方法,那么这是一种不好的做法?此方法没有用,您应该直接内联它。还要注意,第二个构造函数非常奇怪,因为它的结尾是
this.isActive=this.isActive
@Elliot,这是一个错误,你的版本是correct@RC-抱歉,内联是什么意思?内联=删除它并将其“内容”放在原来的位置called@RC-如果我的ChargeGun grow属性使用的是私有方法,那么这是一种不好的做法?问题是它是一个子类,所以我无法链接它们。他们称抽象构造函数。问题是它是一个子类,所以我不能链接它们。他们称之为抽象构造函数。