Run queries on your Java code to check if it meets the criteria suggested by the book Effective Java. And some others.
【有效 Java 检查工具】
有效 Java 是一个用于检查 Java 代码库的工具,您可以以三种不同的方式使用它:
- 作为 Java 语法检查器。只需指定要检查的目录,它就会输出一系列警告和改进建议。
- 通过命令行运行查询。它可以告诉您代码库中使用的单例类型,或者有多少构造函数具有10个或更多参数。这种模式可以轻松与其他工具集成。
- 运行交互式查询。这允许一次性解析代码库,然后运行不同查询来发现有关其有趣的事实。
该项目命名为 "有效 Java" ,因为许多查询和检查源自阅读《Effective Java》一书。还将实现其他查询(欢迎提出您喜欢的查询!)。
在阅读那本书时,我认为虽然许多原则是众所周知的,但在大型代码库中应用它们却很少见。我认为在实践中应用这些原则比看起来更难,而这样的工具可以帮助不断改进代码库。
如何最简单地安装?
从 发布页面 下载独立的 JAR 文件。 无需依赖项,所有内容都已打包在 JAR 文件中。 请随意重命名(effectivejava-0.1.0-SNAPSHOT-standalone.jar 实在有些冗长...)
代码检查模式:如何使用
只需运行:
# 此命令生成 JAR 文件
lein jar
# 注意 0.1.3 是当前版本,将来可能会更改
java -jar effectivejava-0.1.3-SNAPSHOT-standalone.jar -l -d "<myJavaProjectDir>"
您可能会看到类似于以下的输出:
org.springframework.jdbc.core.SqlInOutParameter : This class has too many constructors (7). Consider using static factory methods or the Builder pattern
如果在代码库根目录下运行此命令,可以省略 -d 选项。
命令行模式:如何使用
假设您想要知道哪些类有5个或以上构造函数,可以运行以下命令:
java -jar effectivejava-0.1.3-SNAPSHOT-standalone.jar -q mc -d "<myJavaProjectDir>" -t 5
您可以期待类似的输出:
Considering 109 Java files
japa.parser.ast.expr.ArrayCreationExpr : 5
japa.parser.ast.body.MethodDeclaration : 5
japa.parser.ast.body.BaseParameter : 5
japa.parser.ast.body.FieldDeclaration : 5
交互模式:如何使用(开发中!)
可以通过 -i 选项启动交互模式。
java -jar effectivejava-0.1.3-SNAPSHOT-standalone.jar -i
典型的交互可能如下所示:
> load "."
Loading .
Java files loaded: 440
> mc th 5
Command not implemented: :MC
如最后一行所示,虽然主要逻辑已经存在,但我们仍缺少一些部分。 这将很快得到修复。
可以运行哪些查询?
我刚刚开始,所以目前只实现了少数查询:
_mc=多个构造函数_: 查找包含与给定阈值相同或更多数量构造函数的类_mcp=构造函数参数过多_: 查找包含与给定阈值相同或更多数量参数的构造函数_st=单例类型_: 检查类型是否实现单例模式,并区分三种类型(公共字段,静态工厂方法,单例枚举)_u=实用程序类_: 查找只有静态方法的类,并确保它们恰好有一个不带参数的私有构造函数
已实施的有效 Java(书籍)项目
| 项目 | 状态 |
|---|---|
| 项目 1 | 完成 |
| 项目 2 | 待办 |
| 项目 3 | 完成 |
| 项目 4 | 完成 |
| 项目 5 | 待办 |
| 项目 6 | 待办 |
| 项目 7 | 完成 |
| 项目 8 | 计划于v0.2 |
| 项目 9 | 计划于v0.2 |
| 项目 10 | 完成 |
| 项目 11 | 待办 |
| ...项目 78 | 待办 |
开发信息
项目是用 Clojure 编写的,使用了名为 JavaParser 的 Java 库。
还需要 Leiningen,Clojure 的构建工具。它应该会为您下载 Clojure。
开发指南
运行 eastwood 时排除无限使用命名空间的检查:
lein eastwood "{:exclude-linters [:unlimited-use]}"
为了验证代码格式正确,使用 cljfmt。可按以下方式运行:
# 验证潜在的样式问题
lein cljfmt check
# 自动修复它们
lein cljfmt fix
我们使用 lein-ancient 来检查我们的依赖项是否最新。
与这本书有什么关系?
我在读这本书,很多建议在理论上似乎很显然,但我猜在我的大型代码库中可能隐藏了一些违规情况。我很好奇有多少违规行为,并且需要一种自动化的方式来找到它们。 我还想学习 Clojure。 而且我有个空闲的周日。 所以...
还有什么呢?
希望你喜欢我的这个小项目。请随时打开问题并提问!
贡献者
David Ortiz 是常规贡献者:他开始修复 bug,设置 Travis 并提供了许多其他改进。