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

时间:2011-12-07 14:24:49

标签: java coding-style checkstyle

是否可以使用Checkstyle禁止使用某些使用系统相关默认值(locale,charset等等)的构造函数或方法。我更喜欢强制执行一个策略,程序员应该明确系统相关的值。所以我认为以下项目是危险的:

  • java.io.FielWriter的所有构造函数
    • 使用系统相关编码
  • OutputStreamWriter(OutputStream os)的{​​{1}}构造函数
    • 使用系统相关编码
  • java.io.OutputStreamWriter方法
    • 使用系统默认区域设置
  • java.lang.String.toLowerCase()方法
    • 使用系统默认语言环境和默认时区

(列表继续,你得到的图片)。

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

3 个答案:

答案 0 :(得分:1)

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

第一个选项是使用Miscellaneous-> Regexp。如果您可以通过正则表达式找到违规行为,这显然是唯一可行的。您需要设置illegalPattern = true。我认为这是一个很好的起点。

第二个选项是创建自己的支票。请参阅Writing Checks

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

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

    这意味着您无法实现某些代码检查   IntelliJ IDEA等高级IDE中提供的功能。对于   例如,您将无法实现发现冗余的检查   类型转换或未使用的公共方法。

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

答案 1 :(得分:0)

我认为Annotation Processor更适合这项任务。从Matthew Farwell's answer“您无法确定表达式的类型。”

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

有些人 - 理论上 - 可以编写一个非法类的扩展来解决系统依赖问题。例如,假设FileWriter有一个获取系统编码的方法。如果LegalWriter扩展了FileWriter并覆盖了该方法,那么我们不应该拒绝使用LegalWriter,只是b / c它扩展了非法类。

如果您使用的是第三方罐子,他们的课程将如何合法。仅仅因为他们没有扩展非法类,并不意味着他们不使用它。然后,如果您使用其中一个类,则代码与系统有关。

答案 2 :(得分:0)

正如Matthewemory所述,没有一种完美的检查方式。这是我的建议:

  • 不要只禁止某些构造函数,而是禁止受影响类的所有构造函数。然后创建自己的子类,隐藏禁用的构造函数。例如,创建一个checkstyle模式“FileWriter\(”和一个子类SystemIndependentFileWriter,只包含一些超类'构造函数。
  • 创建模式“toLowerCase()”并希望没有人创建具有相同名称的方法。 Or use FindBugs to catch this one.
  • 创建一个检查样式“Calendar.getInstance()”。我没有看到那个问题。

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