SonarQube 正在报告删除此表达式,该表达式始终计算为“true”

Nex*_*nts 2 java sonarqube sonarlint

我有以下代码:

final Set<String> desktopMediaCodes = getCodesByMediaDeviceType(mediaModels, MediaDeviceType.DESKTOP);
final Set<String> mobileMediaCodes = getCodesByMediaDeviceType(mediaModels, MediaDeviceType.MOBILE);
final Set<String> tabletMediaCodes = getCodesByMediaDeviceType(mediaModels, MediaDeviceType.TABLET);

//In case they are the same, only default.
if (desktopMediaCodes.equals(mobileMediaCodes) && mobileMediaCodes.equals(tabletMediaCodes)) {
    asset.setDefaults(desktopMediaCodes);
    return;
}

//In case three are different, we will send mobile, desktop and tablet.
if(!desktopMediaCodes.equals(mobileMediaCodes) && !desktopMediaCodes.equals(tabletMediaCodes) && !mobileMediaCodes.equals(tabletMediaCodes)){
    asset.setDesktop(desktopMediaCodes);
    asset.setMobile(mobileMediaCodes);
    asset.setTablet(tabletMediaCodes);
    return;
}

//In case only tablet is different, we will send default and tablet.
if(desktopMediaCodes.equals(mobileMediaCodes) && !mobileMediaCodes.equals(tabletMediaCodes)){
    asset.setDefaults(desktopMediaCodes);
    asset.setTablet(tabletMediaCodes);
    return;
}

//In case only desktop is different, we will send default and tablet.
if(mobileMediaCodes.equals(tabletMediaCodes) && !tabletMediaCodes.equals(desktopMediaCodes)){
    asset.setDefaults(mobileMediaCodes);
    asset.setDesktop(desktopMediaCodes);
    return;
}

//In case only mobile is different, we will send default and tablet.
if(tabletMediaCodes.equals(desktopMediaCodes) && !tabletMediaCodes.equals(mobileMediaCodes)){
    asset.setDefaults(tabletMediaCodes);
    asset.setMobile(mobileMediaCodes);
    return;
}
Run Code Online (Sandbox Code Playgroud)

SonarQube 向我报告说

屏幕有问题

(黄色区域)

但这不是真的,这是一个错误还是我错过了什么?SonarQube 让我很困惑。

aga*_*rys 5

您需要阅读整个上下文。您的代码中有 5 个 if 语句。我会稍微简化一下:

1) D == M && M == T

2) D != M && D != T && M != T

3) D == M && M != T

4) M == T && D != T

5) D == T && D != M
Run Code Online (Sandbox Code Playgroud)

我们来分析一下代码。

首要问题

它告诉您始终在第三行M != T求值:true

3) D == M && M != T
Run Code Online (Sandbox Code Playgroud)

为什么?因为你的第一行是:

1) D == M && M == T
Run Code Online (Sandbox Code Playgroud)

它保证第三行中只能使用以下值:

D == M && M != T
D != M && M != T
D != M && M == T
Run Code Online (Sandbox Code Playgroud)

你可以将其理解为:

  • ifD == M那么M必须是 != T(检查没有意义M != T
  • if D != MthenM可能是 = 或 != T(我们必须检查 if M= 或 != T

新代码是:

1) D == M && M == T

2) D != M && D != T && M != T

3) D == M

4) M == T && D != T

5) D == T && D != M
Run Code Online (Sandbox Code Playgroud)

第二期

与第一期的情况相同。D != T始终评估true第四行:

4) M == T && D != T
Run Code Online (Sandbox Code Playgroud)

因为第三行:

3) D == M
Run Code Online (Sandbox Code Playgroud)

保证D != M. 第二行:

2) D != M && D != T && M != T
Run Code Online (Sandbox Code Playgroud)

保证:

D == T && M != T
D != T && M == T
D == T && M == T
Run Code Online (Sandbox Code Playgroud)

我们将删除第三个选项,因为第一行捕获了它:

1) D == M && M == T
Run Code Online (Sandbox Code Playgroud)

现在我们有:

D == T && M != T
D != T && M == T
Run Code Online (Sandbox Code Playgroud)

你可以将其理解为:

  • ifD == M那么M必须是 != T(检查没有意义M != T
  • 如果D != M那么M必须是= T(检查没有意义M == T

新代码是:

1) D == M && M == T

2) D != M && D != T && M != T

3) D == M

4) M == T

5) D == T && D != M
Run Code Online (Sandbox Code Playgroud)

第三、第四期

整个 if 条件始终评估为true。我们来读一下第五行:

5) D == T && D != M
Run Code Online (Sandbox Code Playgroud)

M != D总是正确的,因为第三行保证了这一点:

3) D == M
Run Code Online (Sandbox Code Playgroud)

新代码是:

1) D == M && M == T

2) D != M && D != T && M != T

3) D == M

4) M == T

5) D == T
Run Code Online (Sandbox Code Playgroud)

我们还可以删除,D == T因为:

3) D == M
4) M == T
Run Code Online (Sandbox Code Playgroud)

在第 5 行,只有以下选项是可能的:D != M && M != T。第二行是:

2) D != M && D != T && M != T
Run Code Online (Sandbox Code Playgroud)

如果D != T那么第二行抓住它。这意味着唯一的可能性是D == T,因此没有必要检查它。

最终代码

1) D == M && M == T

2) D != M && D != T && M != T

3) D == M && M != T

4) M == T && D != T

5) D == T && D != M
Run Code Online (Sandbox Code Playgroud)

  • 非常好的答案,非常有深度。通过像这样简化表达式的好方法。 (2认同)