是否可以使用Checkstyle禁止使用某些使用系统相关默认值(locale,charset等等)的构造函数或方法。我更喜欢强制执行一个策略,程序员应该明确系统相关的值。所以我认为以下项目是危险的:
java.io.FielWriter
的所有构造函数
OutputStreamWriter(OutputStream os)
的{{1}}构造函数
java.io.OutputStreamWriter
方法
java.lang.String.toLowerCase()
方法
(列表继续,你得到的图片)。
是否可以使用Checkstyle 5.5强制执行此操作?
答案 0 :(得分:1)
默认情况下,您无法执行此操作。但是,您可以实现自己的检查器来检查这些方法。
第一个选项是使用Miscellaneous-> Regexp。如果您可以通过正则表达式找到违规行为,这显然是唯一可行的。您需要设置illegalPattern = true。我认为这是一个很好的起点。
第二个选项是创建自己的支票。请参阅Writing Checks。
编写检查器有一些限制。第一个也是最重要的是你看不到其他文件。没有任何交叉检查。来自网站:
- 您无法确定表达式的类型。
- 您无法看到其他文件的内容。 (尽管您可以保存已处理的文件以供日后使用)
醇>这意味着您无法实现某些代码检查 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并且是非法的。
如果您使用的是第三方罐子,他们的课程将如何合法。仅仅因为他们没有扩展非法类,并不意味着他们不使用它。然后,如果您使用其中一个类,则代码与系统有关。
答案 2 :(得分:0)
正如Matthew和emory所述,没有一种完美的检查方式。这是我的建议:
FileWriter\(
”和一个子类SystemIndependentFileWriter
,只包含一些超类'构造函数。toLowerCase()
”并希望没有人创建具有相同名称的方法。 Or use FindBugs to catch this one. Calendar.getInstance()
”。我没有看到那个问题。希望它只会抛出一些误报,可以放在忽略列表中。最终你需要调整它以捕捉换行符或其他错位的空格。