Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java检查样式:最终参数引用变量赋值_Java_Checkstyle - Fatal编程技术网

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

Java检查样式:最终参数引用变量赋值,java,checkstyle,Java,Checkstyle,我正在一个Java项目中解决Checkstyle警告 假设这是我的方法: public SomeObject someObjectBehavior(SomeObject oldSomeObject, SomeObject newSomeObject) { if(oldSomeObject == null) { oldSomeObject = newSomeObject; } } 当我启用Checkstyle时,它会通知 参数oldSomeObje

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

假设这是我的方法:

public SomeObject someObjectBehavior(SomeObject oldSomeObject,
    SomeObject newSomeObject) {

    if(oldSomeObject == null) { 
        oldSomeObject = newSomeObject; 
    } 
}
当我启用Checkstyle时,它会通知

参数oldSomeObject应该是final

参数newSomeObject应该是final

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

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

    if(oldSomeObject == null) {
        oldSomeObject = newSomeObject;  //Assignment operation
    } 
}
所以,现在赋值操作是不可能的,Java代码中有一个错误

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

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

多谢各位

问候


Ankur Sharma

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

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

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

试试像这样的东西

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

您提供的示例方法

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


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

这个checkstyle规则是一个完美的例子,先射击(必须是最终的,否则它是错误的)然后提问(是否确实发生了重新分配)。

好吧,我不是在写新代码,它是一个现有的代码,所以我必须解决所有的checkstyle问题。另外,oldSomeObject只是一个引用变量,所以我只是在分配引用,有什么办法吗?@AnkurSharma代码有效吗?不要改变它。。打开以进行接近修改的扩展。@nachokk,是的,这是一个工作代码,没有检查样式,我可以全部生成。你说为扩展兄弟开放是什么意思?@AnkurSharma~“我必须解决所有的检查风格问题”。为什么?我理解,但问题是,我需要将newSomeObject的引用传递给oldSomeObject,以防oldSomeObject为null,并且两个参数都是final。realObject现在有了引用,这很好,我如何将其分配回调用位置?您返回它并将方法调用的结果分配给您的变量。嗯,我明白了,final是一件好事,检查样式强制执行,但是如果我的oldSomeObject为null,我必须将newSomeObject引用分配给oldSomeObject,它们只是引用变量,所以当方法完成时,控件返回到被调用的位置,现在oldSomeObject和newSomeObject都指向同一个内存位置(当oldSomeObject为null时),所以我想知道,应该如何遵守checkstyle,同时又不违反java规则:)@Ankur:对方法中的
oldSomeObject
引用执行什么操作并不重要,一旦方法结束,任何更改都将被丢弃,因为它是一个局部变量。问题是,java给了我错误消息,分配无法完成,因为参数(oldSomeOBject)是最终的(这是显而易见的)…但我的想法是,一定有某种方法,当检查样式通知不应该出现时,我也没有看到代码中有任何错误:|实际上,我们正在使用Jenkins进行构建,因此我们必须解决所有的检查样式问题(大多数),但这是介于两者之间的一些不平衡的情况,@Ankur:由于赋值无法完成任何操作,因此修复错误的最佳方法就是将其删除。在Java中,方法参数被视为局部变量,因此,给方法参数赋值对方法的调用方没有影响。这只会让您的方法的读者感到困惑,他们可能会认为,
oldSomeObject
引用了传入的值,但却包含了在方法中分配给它的值。@AnkurSharma您分配通过参数传递的对象值的用例是什么?@Igor Ganapolsky,实际上这是一个预先编写的代码,我们得到的代码只解决尽可能多的checkstyle问题。我已经修改了上述作业的代码,但我们当时不允许修改代码…所以出现了这种情况。这是一个评论,不是答案。如果你回答了这个问题,你很可能会得到足够的代表来添加评论:-)