涉及最终字段的setter方法的问题

问题描述:

在我的三个实例变量中,这些变量都是最终的。但是,当我尝试在setter方法中执行类似this.inputsRelated = inputsRelated的操作时,我得到一个可理解的错误,它说明最终字段无法分配。但是,设置方法中的方法/我应该如何处理方法public void setInputsRelated(boolean inputsRelated)public void setExpected(int expected)?提前致谢!涉及最终字段的setter方法的问题

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; 
    } 

} 
+3

如果这些字段是最终的,则这些方法不应该存在。必须在声明或构造函数中设置最终字段。 – axblount 2015-04-02 17:32:44

+1

如果你想重新分配这些字段的值,为什么使用final? – 2015-04-02 17:33:18

+0

已解决!教授犯了一个错误,最终使实例变量。 – Inferno 2015-04-02 17:49:18

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

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

+0

感谢您的快速回复,但我的指示是这样的,我应该包括setters方法。 – Inferno 2015-04-02 17:34:59

+0

你不能同时做两个。如果你真的需要创建setter,你应该删除'final'修饰符。 – 2015-04-02 17:36:15

+0

已解决!教授犯了一个错误,最终使实例变量。 – Inferno 2015-04-02 17:49:12

你不应该为最终实例变量设置setter,因为你不能设置它们。要么让你的变量不是最终的或者移除setter。

您只能使用getter方法,如果最终没有使用setter方法。如果想要提供setter,那么没有必要让他们成为final。

一旦你做了一个变量或引用最终你不允许改变它,编译器会验证这一点,并提高编译错误,如果你尝试重新初始化java中的最终变量。

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