我的EclipseSource的同事Moritz最近遇到了Google Auto,它是Java代码生成器的集合。 AutoValue是其中之一,它为不可变对象生成Java代码。 它提供一个注释和一个注释处理器 ,以为不可变值对象生成Java代码。 当前版本标记为RC1,即将发布1.0版。
想法是要有一个定义外部行为的抽象类,而注释处理器将完成其余工作。 对于每个期望的字段,定义了一个抽象访问器方法。 最后,需要一个工厂方法来创建所生成类的实例。
@AutoValue
abstract class Person {
static Person create( String name, int age ) {
return new AutoValue_Person( name, age );
}
abstract String name();
abstract int age();
}
运行处理器之后,您还将拥有一个AutoValue_Person类,该类位于同一包中,并实现访问器方法以返回字段值。 它还实现了equals,hashCode和toString。 生成的代码如下所示:
final class AutoValue_Person extends Person {
private final String name;
private final int age;
AutoValue_Person(String name, int age) {
if (name == null)
throw new NullPointerException("Null name");
this.name = name;
this.age = age;
}
String name() {
return name;
}
...
public String toString() {
...
}
public boolean equals(Object o) {
...
}
public int hashCode() {
...
}
}
如您所见,其中没有魔术。 处理器生成可读且可调试的代码,而没有任何运行时相关性。 可以自定义可空性,序列化,等于的自定义实现,hashCode和toString等方面。 单击项目自述文件中的链接以获取所有详细信息。
我很想想到一个可以做一件事并且做得很好的小工具。 编写EqualsTester的很大一部分是通过测试equals和hashCode(可能是针对不可变的值对象)而进行的。 如果AutoValue已经存在了,那么它可能会节省一些精力。 但是,如果该工具不能很好地集成到您选择的IDE中,那么它的实用性将受到限制。
将AutoValue集成到Eclipse中
在IDE中使用AutoValue时,您可能希望在保存源文件后立即生成代码。 我选择的IDE是Eclipse,因此我采取了以下步骤将注释处理器集成到Eclipse中。
必须为每个项目指定Eclipse中注释处理的规则。 因此,第一件事是为使用处理器的项目启用注释处理(项目属性> Java编译器>注释处理)。 默认情况下,生成的代码将写入单独的源文件夹(“生成的源目录”设置),以便可以将其从版本控制中排除。
接下来,我告诉Eclipse在哪里可以找到@AutoValue注释的注释处理器。 处理器与注释本身一起打包在auto-value-1.0-rc1.jar中。 从这个jar开始,沿着它的依赖关系链,我最终得到了运行处理器所必需的这些库(所有这些库都可以从Maven Central获得):
- 自动服务1.0-rc1.jar
- 番石榴16.0.1.jar
- jsr-305-2.0.3.jar
- 自动值1.0-rc1.jar
好吧,一切都是有代价的。 但是,将这些罐子添加到“工厂路径”就足够了。 每当我按Ctrl + S时,处理器都会为项目中每个@AutoValue注释类生成(重新)代码-非常时尚……
剩下的就是使设置易于为其他团队成员使用。 这里的问题是将罐子放置在可跨不同开发人员计算机移植的位置。 除了检查设置和源代码存储库中约2MB的jar之外,我没有找到其他解决方案。 虽然绝对不希望在存储库中使用二进制文件,但是让每个团队成员从某个地方拉出罐子也同样糟糕。 如果您知道解决此难题的方法,请分享您的想法。
翻译自: https://www.javacodegeeks.com/2014/03/using-the-autovalue-code-generator-in-eclipse.html