Java 用于防止调用某些方法和构造函数的Checkstyle规则

Java 用于防止调用某些方法和构造函数的Checkstyle规则,java,coding-style,checkstyle,Java,Coding Style,Checkstyle,是否可以使用Checkstyle来禁止使用某些使用依赖于系统的默认值(区域设置、字符集等)的构造函数或方法。我更喜欢执行一个策略,程序员应该明确系统相关的值。因此,我认为以下项目是危险的: java.io.FielWriter的所有构造函数 使用系统相关编码 OutputStreamWriter(outputstreamos)java.io.OutputStreamWriter的构造函数 使用系统相关编码 java.lang.String.toLowerCase()方法 使用系统默认

是否可以使用Checkstyle来禁止使用某些使用依赖于系统的默认值(区域设置、字符集等)的构造函数或方法。我更喜欢执行一个策略,程序员应该明确系统相关的值。因此,我认为以下项目是危险的:

  • java.io.FielWriter的所有构造函数
    
    • 使用系统相关编码
  • OutputStreamWriter(outputstreamos)
    java.io.OutputStreamWriter的构造函数
    • 使用系统相关编码
  • java.lang.String.toLowerCase()方法
    
    • 使用系统默认区域设置
  • java.util.Calendar.getInstance()方法
    
    • 使用系统默认语言环境和默认时区
(列表还在继续,你明白了)


是否可以使用Checkstyle 5.5强制执行此操作?

默认情况下无法执行此操作。但是,您可以实现自己的检查器来检查这些方法

第一个选项是使用Miscellaneous->Regexp。显然,只有在可以找到与regexp冲突的情况下,这才有可能。您需要将illegalPattern设置为true。我想这是一个很好的开始

第二个选项是创建自己的支票。看

写跳棋是有限制的。首先也是最重要的一点是,您无法查看其他文件。没有交叉核对。从网站:

  • 无法确定表达式的类型
  • 您无法查看其他文件的内容。(尽管您可以保存已处理的文件以供以后使用)
  • 这意味着您无法实现某些代码检查 高级IDE(如IntelliJ IDEA)中提供的功能。对于 例如,您将无法执行发现冗余的检查 类型强制转换或未使用的公共方法


    因此,例如,您无法检查java是否正在调用一个具有区域设置的替代方法。您可以使用不允许调用的方法的黑名单。例如,对new FileWriter()的调用将检查传递的参数的数量,或者诸如此类。

    我认为注释处理器更适合此任务。从“无法确定表达式的类型。”

    假设您使用的第三方jar包含扩展FileWriter的FancyWriter类。您非法放置了一个
    x=newfancywriter()在您的代码中。CheckStyle找不到它,因为它使用的是正则表达式,而且它不够聪明,无法知道FancyWriter是一个文件编写器。我认为您可以编写一个注释处理器,以确定FancyWriter实际上是一个文件编写器,并且是非法的

    另外,理论上,有人可以编写非法类的扩展来消除系统依赖性。例如,假设FileWriter有一个获取系统编码的方法。如果LegalWriter扩展了FileWriter并重写了该方法,那么我们不应该拒绝LegalWriter,因为它扩展了一个非法类

    如果您使用的是第三方JAR,它们的类如何合法。仅仅因为他们不扩展非法类,并不意味着他们不使用它。然后,如果您使用他们的一个类,那么您的代码是依赖于系统的。

    如前所述,没有检查样式的完美解决方案。以下是我的建议:

    • 不要只禁止某些构造函数,而是禁止受影响类的所有构造函数。然后创建您自己的子类,它隐藏禁止的构造函数。例如,创建一个checkstyle模式“
      FileWriter\(
      )和一个子类
      SystemIndependentFileWriter
      ,该子类只使用一些超类的构造函数
    • 创建模式“
      toLowerCase()
      ”,并希望没有人创建具有相同名称的方法
    • 创建一个checkstyle模式“
      Calendar.getInstance()
      ”。我看不出这个模式有问题

    希望它只会抛出一些误报,这些误报可能会被放在忽略列表上。最终,您需要调整它以捕获换行符或其他错误放置的空格。

    问得好。我个人认为,默认情况下,编译器本身应该警告这一点-这么多可能的错误-使用这些方法几乎不可能是正确的正确的做法..Oracle应该为这些方法添加一个@SystemDependent注释。我已经编写了一个自定义检查,以避免使用新日期(),如果您感兴趣,请参阅以下内容: