【问题标题】:Checkstyle rule to prevent invocation of some methods and constructorsCheckstyle 规则以防止调用某些方法和构造函数
【发布时间】:2012-01-15 01:20:45
【问题描述】:

是否可以使用 Checkstyle 来禁止使用某些使用系统相关默认值(语言环境、字符集等)的构造函数或方法。我更喜欢执行一个程序员应该明确系统相关值的策略。所以我认为以下物品是危险的:

  • java.io.FielWriter 的所有构造函数
    • 使用系统相关编码
  • java.io.OutputStreamWriterOutputStreamWriter(OutputStream os) 构造函数
    • 使用系统相关编码
  • java.lang.String.toLowerCase() 方法
    • 使用系统默认语言环境
  • java.util.Calendar.getInstance() 方法
    • 使用系统默认语言环境和默认时区

(不胜枚举,看图)。

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

【问题讨论】:

  • 好问题。就我个人而言,我认为这是编译器本身默认情况下应该警告的事情 - 这么多可能的错误 - 使用这些方法几乎不是正确的做法..
  • Oracle 应该为这些方法添加一个@SystemDependant 注释。
  • 我已经写了一个自定义检查来避免 new Date(),如果你有兴趣可以看看这个:beansgocrazy.blogspot.com.au/2012/04/when-dates-go-wild.html

标签: java coding-style checkstyle


【解决方案1】:

正如Matthewemory 所说,检查样式​​没有完美的解决方案。这是我的建议:

  • 不要只禁止某些构造函数,而是禁止受影响类的所有构造函数。然后创建你自己的子类,它隐藏了被禁止的构造函数。例如,创建一个 checkstyle 模式“FileWriter\(”和一个子类SystemIndependentFileWriter,其中只有一些超类的构造函数。
  • 创建模式“toLowerCase()”并希望没有人创建具有相同名称的方法。 Or use FindBugs to catch this one.
  • 创建一个格子图案“Calendar.getInstance()”。我认为那个没有问题。

希望它只会抛出一些误报,可以将其列入忽略列表。最终,您需要对其进行调整以捕捉换行符或其他错位的空格。

【讨论】:

    【解决方案2】:

    我认为注释处理器更适合这项任务。来自Matthew Farwell's answer“您无法确定表达式的类型。”

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

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

    如果您使用第三方 jar,他们的类如何合法。仅仅因为他们不扩展非法类,并不意味着他们不使用它。然后,如果您使用他们的类之一,您的代码是系统相关的。

    【讨论】:

      【解决方案3】:

      默认情况下您不能这样做。但是,您可以实现自己的检查器来检查这些方法。

      第一个选项是使用 Miscellaneous->Regexp。这显然只有在您可以使用正则表达式发现违规时才有可能。您将需要设置非法模式 = true。我认为这是一个很好的起点。

      第二个选项是创建您自己的支票。见Writing Checks

      编写检查器有一些限制。第一个也是最重要的是你看不到其他文件。没有任何交叉检查。来自网站:

      1. 您无法确定表达式的类型。
      2. 您看不到其他文件的内容。 (尽管您可以保存处理后的文件以备后用)

      这意味着你不能实现一些代码检查 IntelliJ IDEA 等高级 IDE 中可用的功能。为了 例如,您将无法实施发现冗余的检查 类型转换或未使用的公共方法。

      因此,您无法检查 java 是否正在调用一种方法,该方法具有使用 Locale 的替代方法。您可以使用不允许调用的方法的黑名单。因此,例如调用 new FileWriter() 将检查传递的参数数量,或类似的。

      【讨论】:

        猜你喜欢
        • 2020-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多