【问题标题】:Issues with setter methods involving final field涉及 final 字段的 setter 方法的问题
【发布时间】:2015-04-02 17:31:00
【问题描述】:

在我的班级中,三个实例变量都是最终的。但是,当我尝试在 setter 方法中执行 this.inputsRelated = inputsRelated 之类的操作时,我收到一个可以理解的错误,提示无法分配 final 字段。但是 setter 方法中的方法/我应该如何处理方法 public void setInputsRelated(boolean inputsRelated)public void setExpected(int expected) ?提前致谢!

public class ExceptionLogicParameters extends RuntimeException {

    public final boolean inputsRelated;
    public final int expected;
    public final int found;

    public ExceptionLogicParameters(boolean inputsRelated, int expected, int found)
    {
        this.inputsRelated = inputsRelated;
        this.expected = expected;
        this.found = found;
    }

    @Override
    public String toString()
    {
        return "Get the the hell out of here!";
    }

    public boolean getInputsRelated()
    {
        return this.inputsRelated;
    }

    public int getExpected()
    {
        return this.expected;
    }

    public int getFound()
    {
        return this.found;
    }

    public void setInputsRelated(boolean inputsRelated)
    {
        this.inputsRelated = inputsRelated;
    }

    public void setExpected(int expected)
    {
        this.expected = expected;
    }

}

【问题讨论】:

  • 如果字段是最终的,则不应存在这些方法。 final 字段必须在声明或构造函数中设置。
  • 如果要重新分配这些字段的值,为什么要使用 final?
  • 已解决!教授犯了一个错误,将实例变量定为 final。

标签: java


【解决方案1】:

如果字段是final,它们只能在变量声明或构造函数中初始化。 Setter 方法对 final 字段没有意义。

您应该分析您的代码并确定字段是否确实应该是最终的,如果是这样,请丢弃 setter 方法。如果确实需要创建 setter,则必须删除 final 修饰符。

【讨论】:

  • 感谢您的快速回复,但我的说明是这样排列的,我应该包括 setters 方法。
  • 你不能同时做这两个。如果你真的需要创建 setter,你应该删除 final 修饰符。
  • 已解决!教授犯了一个错误,将实例变量定为 final。
【解决方案2】:

您不应该为最终实例变量设置设置器,因为您无法设置它们。要么使您的变量成为非最终变量,要么删除设置器。

【讨论】:

    【解决方案3】:

    你只能使用 getter 方法,如果 final 没有使用 setter 方法。如果想提供 setter,则没有必要将它们定为 final。

    【讨论】:

      【解决方案4】:

      一旦你创建了一个变量或引用 final,你就不能更改它,如果你尝试在 java 中重新初始化 final 变量,编译器将验证这一点并引发编译错误。

      在您的情况下,由于变量的先前最终声明,mutator 和 accessor (set/get) 方法是无用的。

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        • 2023-03-05
        • 2014-05-29
        • 1970-01-01
        • 2012-06-23
        • 1970-01-01
        相关资源
        最近更新 更多