我不喜欢这段代码,但我喜欢它的功能(懒散地检索):
private final HugeMatrix storedMatrix;
public HugeMatrix matrix() {
if (this.storedMatrix == null) {
this.storedMatrix = // compute the huge matrix
}
return storedMatrix;
}
我喜欢这段代码,我希望它能像上面代码那样做:
@Lazy
public HugeMatrix matrix() {
return // compute the huge matrix
}
私人领域和支票是样板。是否可以使用类似于Project Lombok的工具为每个带注释的方法自动生成它们?这样的工具存在吗?无论它是在字节码还是在生成的源上运行都没有关系,唯一重要的是原始源代码应该很好阅读。
我自己会写一个工具,但我不知道该使用什么(我已经尝试过AspectJ和注释处理器;这些东西似乎不适合这个任务,但我可能也错了它们)。
答案 0 :(得分:1)
@Lazy HugeMatrix matrix = // compute the huge matrix
如果您不了解groovy,那么这种语言不仅所有Java代码都有效(因此您已经可以编写它了!)它还具有更简洁的语法。它编译为Java字节代码,因此没有额外的运行时要求。如果你想要的话,它也是动态的,它由IntelliJ开箱即用。
一般来说,如果你讨厌样板文件,你会喜欢groovy!
例如,这是一个immutable类,其实现了equality contract:
@Immutable
class Person {
String first, last
int age
}
就是这样!
注意@Immutable
为您提供@EqualsAndHashCode
,但如果您不想要不可变,则可以使用@EqualsAndHashCode
。
用法:
def c1 = new Customer(first:'Tom', last:'Jones', age:21);
def c2 = new Customer("Tom", 'Jones', 21);
assertEquals(c1, c2);
答案 1 :(得分:0)
您可以轻松地将其写在一行:)
if(this.storedMatrix==null){this.storedMatrix=compute()}return storedMatrix;
开玩笑说,JSR-107可以接近你所需要的。此外,如果您可以使用Java 8,则lambda表达式可能有助于减少这样的样板代码。