Java检查样式:最终参数引用变量赋值

时间:2014-01-07 14:05:44

标签: java checkstyle

我正在努力解决Java项目中的Checkstyle警告。

假设这是我的方法:

public SomeObject someObjectBehavior(SomeObject oldSomeObject,
    SomeObject newSomeObject) {

    if(oldSomeObject == null) { 
        oldSomeObject = newSomeObject; 
    } 
}

当我启用Checkstyle时,它会通知

  

参数oldSomeObject应该是最终的

     

参数newSomeObject应该是最终的

当我转换这两个参数时:

public SomeObject someObjectBehavior(final SomeObject oldSomeObject,
    final SomeObject newSomeObject) {

    if(oldSomeObject == null) {
        oldSomeObject = newSomeObject;  //Assignment operation
    } 
}

因此,现在无法进行赋值操作,Java代码中存在错误

  

无法分配最终的局部变量oldSomeObject。它必须为空白且不使用复合赋值。

如果你们中的任何一个人遇到过这种情况,那么请帮忙,因为我正试图解决所有的Checkstyle问题。

谢谢

此致

Ankur Sharma

4 个答案:

答案 0 :(得分:6)

重新分配参数被认为是不好的风格。你应该创建一个新的局部变量。

答案 1 :(得分:4)

您提供的示例方法

public SomeObject someObjectBehavior(final SomeObject oldSomeObject,final SomeObject newSomeObject) { 
    if(oldSomeObject == null) { 
        oldSomeObject = newSomeObject;  //Assignment operation
    } 
}

是为什么让参数final成为好主意的完美示例。在不设置变量final的情况下,您可能没有意识到您的方法什么都不做,因为重新分配参数引用不会改变方法之外的任何内容。

答案 2 :(得分:3)

将参数定义为final的主要原因是为了避免以后无意中覆盖它们。如果你最终定义它们,你总是可以确保参数始终是首先给出的方法。

如果要更改值,使用新的局部变量是更好的样式。在许多情况下,只分配一次变量会使代码更具可读性。它并非总是可能,但往往是可能的。

尝试类似

的内容
Object realObject;
if (oldSomeObject != null) { 
  realObject = oldSomeObject;
} else {
  realObject = newSomeObject;
}

答案 3 :(得分:-2)

此检查样式规则是首先拍摄(必须是最终决定,否则是错误的)并随后询问问题(实际上会发生重新分配)的完美示例。