在不改变语言的前提下如何推进Java的不断演进
2010-03-22 00:00:00 来源:WEB开发网除了Single Abstract Method所需的参数外,方法体还可以通过@As.Additional注解声明额外的参数。在获得SAM类型的实例时,这些参数可以带有绑定值,然后 在每次调用时传递给方法。
Chapman还创建了Rapt项目以探索该技术的其他使用场景,同时为语言的两个变化提供了自己的实现——多行字符串(Multiline Strings)与XML字面值(XML literals)——这两个特性是 为JDK 7准备的,但却不会包含到最终的发布中。Java甚至也可以使用这种方法实现闭包,Chapman对此说到:
我们刚刚使用该技术完成了一个Swing项目,在这个过程中发现了泛型的一些小bug,其中一个bug还没有修复,除此之外一切都很棒,没人再想使用传统 的匿名内部类了。
另一个探究注解处理器的项目是Lombok,它将该技术又向前推进了一大步。Lombok将注解作为回调以运行Java agent,后者会根据注解重写各种javac内核。由于操纵的是内部类,因此它不太适合于产品使用(JVM各个小版本中的内部类也可能不一样),但该项目对于注解处理器到底能做什么这个问题上还是颇具启发意义的,包括:
通过@Getter和@Setter注解定义各种访问级别的属性,如@Setter(AccessLevel.PROTECTED) private String name;
@EqualsAndHashCode注解会根据对象中的属性实现hashCode()和 equals()方法
@ToString注解会实现toString()方法
@data方法相当于 @ToString、@EqualsAndHashCode、所有属性的@Getter以及所有非final属性的@Setter的集合,可以使用 @data方法和构造方法初始化final属性
还可以通过这种方式进行其他的语言试验,比如移除Java中的非运行时异常等。
虽然注解处理器技术为语言试验开辟了一条新航线,但还是要注意生成代码的可读性,保证开发者能读懂生成的代码。Chapman给出了很多建议:
更多精彩
赞助商链接