Java检查样式:最终参数引用变量赋值
我正在一个Java项目中解决Checkstyle警告 假设这是我的方法:Java检查样式:最终参数引用变量赋值,java,checkstyle,Java,Checkstyle,我正在一个Java项目中解决Checkstyle警告 假设这是我的方法: public SomeObject someObjectBehavior(SomeObject oldSomeObject, SomeObject newSomeObject) { if(oldSomeObject == null) { oldSomeObject = newSomeObject; } } 当我启用Checkstyle时,它会通知 参数oldSomeObje
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问题。我已经修改了上述作业的代码,但我们当时不允许修改代码…所以出现了这种情况。这是一个评论,不是答案。如果你回答了这个问题,你很可能会得到足够的代表来添加评论:-)