2011-12-07 52 views
7

是否可以使用Checkstyle禁止使用某些构造函数或使用与系统相关的默认值(语言环境,字符集等)的方法。我更愿意强制执行一项政策,程序员应明确系统相关值。所以,我认为以下项目是危险的:Checkstyle规则阻止调用某些方法和构造函数

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

(这样的例子不胜枚举,你得到的图片)。

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

+0

好问题。就我个人而言,我认为这是编译器本身应该默认警告的东西 - 如此多的可能的错误 - 使用这些方法几乎是不对的。 – Voo

+1

Oracle应该为这些方法添加@SystemDependant批注。 – gawi

+0

我写了一个自定义检查来避免新的Date(),如果您感兴趣,请参阅以下内容:http://beansgocrazy.blogspot.com.au/2012/04/when-dates-go-wild.html – n0rm1e

回答

1

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

第一个选项是使用杂项 - >正则表达式。这显然只有在您可以找到使用正则表达式的违规时才有可能。你将需要设置illegalPattern = true。我认为这将是一个很好的开始。

第二种选择是创建自己的支票。见Writing Checks

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

  1. 您无法确定表达式的类型。
  2. 您看不到其他文件的内容。 (虽然可以节省用于处理文件后)

这意味着你不能执行一些代码检查 功能,是在先进的IDE像IntelliJ IDEA的使用。对于 示例,您将无法执行检查,发现多余的 类型转换或未使用的公共方法。

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

0

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

假设您使用包含扩展FileWriter类的FancyWriter的第三方jar。您非法将x = new FancyWriter () ;置入您的代码中。 CheckStyle不会找到它,因为它使用正则表达式,并且它不够聪明,无法知道FancyWriter是FileWriter。我认为你可以编写一个注释处理器来计算FancyWriter实际上是一个FileWriter并且是非法的。

另外,有人 - 理论上 - 可以写一个非法类的扩展,消除系统依赖。例如,假定FileWriter有一个获取系统编码的方法。如果LegalWriter扩展FileWriter并覆盖该方法,那么我们不应该拒绝LegalWriter只是b/c它扩展了一个非法类。

如果您使用第三方罐子,他们的课程将如何合法。仅仅因为他们不扩大非法班级,并不意味着他们不使用它。那么如果你使用他们的一个类,你的代码是依赖于系统的。

0

由于Matthewemory指出,没有一个完美的解决方案与检查风格。这里是我的建议:

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

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

相关问题