gpt4 book ai didi

java - 是否可以基于字段注入(inject)而不是Map来实现方法结果缓存?

转载 作者:行者123 更新时间:2023-12-02 09:43:14 25 4
gpt4 key购买 nike

我已经看到了一些使用 AspectJ 进行方法结果缓存的实现。例如,jcabi-aspects 中的一项或一些older examples

这个想法是,不要编写 bolierplate 代码来缓存字段中方法的结果,如下所示:

public Mesh someComplexGeometry() {
if (this.geometry == null) {
this.geometry = computeTheGeometry();
}
return this.geometry;
}

我们对方法进行注释,以便 AspectJ 编译器更改其字节码,以便将其结果存储在第一次执行后的某个位置,并在连续执行时检索:

@Cacheable
public Mesh someComplextGeometry() {
// just compute the mesh, very neat and clear
}

我在这里担心的是,我所见过的所有缓存方面的实现都是基于在 Map 中存储值。它还涉及为这些映射构建 key 的相当复杂的过程。恐怕这可能会对性能产生一些影响。

我认为如果有一个方面以这种方式工作那就太理想了:对于用 @Cacheable 注释的类的每个 n 方法,添加一个field private Object cache_n 到该类,然后在第一个方法调用时将结果存储在字段中,而不是在 Map 中,然后继续在连续方法中返回字段内容来电。

因此,我们的想法是在编织过程中为每个带注释的方法注入(inject)自定义私有(private)字段,而不是使用整个胖Map。但我不知道如何做到这一点以及是否可能。

以下方面实现了我想要的,但仅适用于类只有一个用 @Cached 注释的方法的情况:

public aspect Cacher {
private Object cache;

pointcut cached(): execution(@Cached * * (..));

Object around(): cached() {
if (cache == null) {
cache = proceed();
}
return cache;
}
}

我可以使用 AspectJ 进行这种缓存吗?如果我不能,是否有任何平台限制不允许这样的事情,或者它只是没有用 AspectJ 语言实现?

最佳答案

您可以通过使用 percflow Per Clause 来实现这种基于字段的内存。这将为每个编织方法创建一个方面的实例。

当然,只有在该方法没有参数时才应该使用它。当方法使用参数时,您仍然需要一个映射来知道根据参数返回什么结果。

关于java - 是否可以基于字段注入(inject)而不是Map来实现方法结果缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30153030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com