gpt4 book ai didi

java - Sonar "useless assignment to local variable"解决方法?

转载 作者:行者123 更新时间:2023-11-29 09:52:00 25 4
gpt4 key购买 nike

我正在努力改进我的代码,我从 Sonar 遇到了这个问题:

Remove this useless assignment to local variable "uiRequest"

事实是,它并非毫无用处,因为我在代码之后就使用了它:

        // I am supposed to remove this
UiRequest uiRequest = null;

if("Party".equals(vauban.getName())) {
uiRequest = contextBuilder.buildContext(vauban);
} else {
// Maybe I could work my way around here ?
throw new NamingException(
String.format(
"Hey %s, change your name to %s, thanks",
vauban.getName(), "Vauban"));
}

// Set the generated Id in the result of context builder
MyOwnService response = callService(uiRequest, vauban);

return response;

Sonar 仍然告诉我“uiRequest”没用,为什么?它不是,因为如果它为空,我不希望它到达代码。我尝试初始化它 (uiRequest = new UiRequest()),但它一直告诉我它没用。

有人知道为什么 Sonar 会这样/如何纠正吗?

最佳答案

您的问题简化为:

Foo x = null;

if(a()) {
x = b();
} else {
throw new Exception();
}

c(x);

这段代码有两条可能的路径:

  1. a() 返回 truex 被分配 b() 然后 c(x) 被调用。
  2. a() 返回 false。抛出异常,c(x) 没有被调用。

这些路径都没有使用 null 的初始赋值调用 c(x)。因此,无论您最初分配什么,都是多余的。

请注意,如果初始分配不是 null,这也会是一个问题。除非赋值的右侧有副作用,否则任何赋值都会被浪费。 ( Sonar 分析副作用)

这对 Sonar 来说是可疑的:

  • 也许程序员期望第一个赋值会产生效果——它没有,所以这可能是一个错误。
  • 这还与代码的清晰度有关—— future 代码的人类读者可能会浪费时间思考初始值的用途。
  • 如果右侧涉及计算,但没有副作用,那将是浪费计算。

您可以通过两种方式解决此问题:

首先只是删除 = null,留下 Foo x; - Java 足够聪明,可以实现所有到 c(x) 的路由涉及赋值,所以这仍然可以编译。

更好的是,将 c(x) 移到 block 中:

if(a()) {
Foo x = b();
c(x);
} else {
throw new Exception();
}

这在逻辑上是等价的,更简洁,并且减少了 x 的范围。缩小范围是一件好事。当然,如果你需要更大范围的x,你就不能这样做了。

还有一个变体,逻辑上也是等价的:

if(! a()) {
throw new Exception();
}

Foo x = b();
c(x);

...对“提取方法”和“内联”重构 react 良好:

throwForInvalidA(...);
c(b());

使用最能传达您意图的那个。

关于java - Sonar "useless assignment to local variable"解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44115011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com