[PMD规则AvoidLiteralsInIfCondition
会在条件(例如AvoidLiteralsInIfCondition
)中使用文字(例如7、10)时标记问题。在课堂上,我通常通过创建if (x > 7)
来保存该值来解决此问题。但是,如果在接口的默认方法中使用文字,则无法在接口中创建private static final
。如何修复private static final
?
我知道我可以使用AvoidLiteralsInIfCondition
或// NOPMD
,但这不能解决问题。使用@SuppressWarnings
不能使代码更清晰。
这里有一些代码演示了问题。
private static final
如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;
}
对于您的示例来说可能很好,但是有两个指导原则:
另一种方法是在默认方法中包含局部声明,并使用这些声明:
if (value <= ConstantHelper.TWO_BYTE_MAX_CP) { // No PMD issue with this.
return 2;
}
如果这样做,将以不同的方式冒犯PMD(“ AvoidFinalLocalVariable:避免使用最终的局部变量,将它们转换为字段”),但是优点是:
因此,如果要外部化的常量值不违反上述两个原则,则创建一个常量类。否则,请在本地声明常量,并接受从PMD收到AvoidFinalLocalVariable警告,因为编写清晰,干净和可维护的代码比删除PMD警告更重要。