java - 有没有办法在编译或源代码处理期间为方法添加惰性评估?

标签 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
}

私有(private)字段和检查是样板。是否可以使用类似于 Project Lombok 的工具为每个带注释的方法自动生成它们?有这样的工具吗?无论它是在字节码上运行还是在生成的源上运行都无关紧要,唯一重要的是原始源代码应该易于阅读。

我会自己写一个工具,但我不知道该用什么(我已经为此目的尝试了 AspectJ 和注释处理器;这些东西似乎不适合这项任务,但我对它们的看法可能又是错误的) .

最佳答案

你可以使用 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);

关于java - 有没有办法在编译或源代码处理期间为方法添加惰性评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30195875/

相关文章:

java - 找不到获取 Spring bean 方法参数的参数化类型的方法

java - 创建 Java 可执行文件

java - 如何在java中创建列表的列表(list<classname>)

java - CyanogenMod 和 OpenGL ES 纹理加载

java - 需要一些关于如何实现评估函数的想法

java - 更改语言西类牙语标签以使用 iText PDFStamper 创建数字签名

java - 使用函数输入 Hibernate 参数

java - 包含java中的方法

java - 运行Spring项目时出现空指针异常

java - 是否可以在 Spring MVC 中进行自动 url 映射?