有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

checkstyle Java check style:最终参数引用变量赋值

我正在一个Java项目中解决Checkstyle警告

假设这是我的方法:

public SomeObject someObjectBehavior(SomeObject oldSomeObject,
    SomeObject newSomeObject) {

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

当我启用Checkstyle时,它会通知

Parameter oldSomeObject should be final

Parameter newSomeObject should be final

当我像这样转换两个参数时:

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

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

所以,现在赋值操作是不可能的,Java代码中有一个错误

The final local variable oldSomeObject cannot be assigned. It must be blank and not using a compound assignment.

如果你们中有人遇到过这种情况,那么请帮助我,因为我正在尝试解决所有Checkstyle问题

多谢各位

问候

安库尔·夏尔马


共 (4) 个答案

  1. # 1 楼答案

    重新指定参数被认为是错误的风格。您应该创建一个新的局部变量

  2. # 2 楼答案

    将参数定义为final的主要原因是避免以后无意中覆盖它们。如果您将它们定义为final,则始终可以确保参数始终是在第一时间赋予方法的参数

    如果要更改值,最好使用新的局部变量。在许多情况下,只分配一次变量可以使代码更具可读性。这并不总是可能的,但通常是可能的

    试试像这样的东西

    Object realObject;
    if (oldSomeObject != null) { 
      realObject = oldSomeObject;
    } else {
      realObject = newSomeObject;
    }
    
  3. # 3 楼答案

    您提供的示例方法

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

    这是一个完美的例子,说明了为什么制作参数final是一个好主意。如果不使用变量final,您可能不会意识到您的方法什么都不做,因为重新指定参数引用不会改变方法之外的任何内容

  4. # 4 楼答案

    这个检查式规则是一个完美的例子,说明了先射击(必须是最终的,否则是错误的),然后再提问(是否真的进行了重新分配)