在接口默认方法中解决避免使用的LiteralsInIfCondition

问题描述 投票:1回答:1

[PMD规则AvoidLiteralsInIfCondition会在条件(例如AvoidLiteralsInIfCondition)中使用文字(例如7、10)时标记问题。在课堂上,我通常通过创建if (x > 7)来保存该值来解决此问题。但是,如果在接口的默认方法中使用文字,则无法在接口中创建private static final。如何修复private static final

我知道我可以使用AvoidLiteralsInIfCondition// NOPMD,但这不能解决问题。使用@SuppressWarnings不能使代码更清晰。

这里有一些代码演示了问题。

private static final
java pmd
1个回答
0
投票

如OP注释中所建议,您可以将常量外部化为外部类:

public interface UTF8Length
{
   default int getUTF8Length(char value)
   {
      if (value <= 0x007F)  // PMD flags a problem with 0x007F
         return 1;

      if (value <= 0x07FF)  // PMD flags a problem with 0x07FF
         return 2;

      return 3;
   }
}

然后,在界面的默认方法中,您可以执行此操作而不会破坏PMD:

public class ConstantHelper {
    public static final int TWO_BYTE_MAX_CP = 0x7FF;
}

对于您的示例来说可能很好,但是有两个指导原则:

  • 将常量外部化为常量类不是一个好方法,如果该常量只是接口的实现细节,并且不可能被任何其他类或接口使用。仅为了删除PMD警告而创建新的常量类是一种有问题的方法。
  • 如果将来将来可能更改值,则将常量外部化为常量类不是一个好方法,因为该更改可能还会影响其他类。在这种情况下,您似乎指的是几乎可以肯定不会改变的Unicode值,因此这不是问题。

另一种方法是在默认方法中包含局部声明,并使用这些声明:

if (value <= ConstantHelper.TWO_BYTE_MAX_CP) { // No PMD issue with this.
    return 2;
}

如果这样做,将以不同的方式冒犯PMD(“ AvoidFinalLocalVariable:避免使用最终的局部变量,将它们转换为字段”),但是优点是:

  • 您不需要外部课程。
  • 我发现代码稍微清晰些,尽管那是个人喜好。
  • 那些本地声明是自记录的,并且-与注释不同-它们必须正确才能使代码正常工作。
  • 那些本地声明是完全私有的。对于您的特定示例来说,这可能不是一个好处,但是很容易想象其他情况,您希望在默认方法中使用常量,而不与其他任何人共享常量。

因此,如果要外部化的常量值不违反上述两个原则,则创建一个常量类。否则,请在本地声明常量,并接受从PMD收到AvoidFinalLocalVariable警告,因为编写清晰,干净和可维护的代码比删除PMD警告更重要。

© www.soinside.com 2019 - 2024. All rights reserved.