有没有办法在编译或源代码处理期间为方法添加延迟评估?

时间:2015-05-12 15:54:13

标签: java

我不喜欢这段代码,但我喜欢它的功能(懒散地检索):

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和注释处理器;这些东西似乎不适合这个任务,但我可能也错了它们)。

2 个答案:

答案 0 :(得分:1)

您可以使用GroovyLazy

@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表达式可能有助于减少这样的样板代码。