【问题标题】:Okay To Call Private Final Method from Constructor?可以从构造函数调用私有最终方法吗?
【发布时间】:2016-04-20 19:41:13
【问题描述】:

我知道您可以从构造函数中调用方法,但是如果可以覆盖该方法,以后可能会导致问题。下面的代码只是我写的一个例子来展示我的问题:

假设我有以下 子类

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 属性增长,那么我将不得不在两个构造函数中添加属性。如果我使用私有的 final 方法来做,一切都设置在一个地方。这是不好的做法吗?

我不能链接 ChargeGun 构造函数,因为它们都调用超类构造函数。

【问题讨论】:

    标签: java constructor


    【解决方案1】:

    一个private方法不能被覆盖,你也不需要标记它final(这也意味着它不能被覆盖)。只需final private 之一就足够了。但是,该方法需要稍作修改。喜欢,

    private void setAttributes(boolean isActive)
    {
        this.isActive = isActive;
    }
    

    您的版本始终将其设置为true。如果那是故意的,我会完全删除setter,然后做类似的事情

    private final boolean isActive = true;
    

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

    【讨论】:

    • 这个方法没用,你应该内联它。另请注意,第二个构造函数相当奇怪,因为它以 this.isActive = this.isActive 结尾
    • @Elliot,这是一个错误,你的版本是正确的
    • @RC - 抱歉,内联是什么意思?
    • inline = 删除它并把它的内容放在它被调用的地方
    • @RC - 如果我的 ChargeGun 属性增长使用私有方法不好?
    【解决方案2】:

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

    另外,您真的应该考虑使用Builder pattern,它清楚地处理可以以多种不同方式构造的那些对象。如果您认为这需要大量工作,只需知道一些 IDE 插件(例如 InnerBuilder)可以轻松生成。如果你看看语言是如何演变的,你会看到越来越多的类似构建器的 api(Stream、Optional...)。

    【讨论】:

    • 问题是它是一个子类,所以我不能链接它们。他们调用抽象构造函数。
    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2014-06-11
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多