我希望这是一个不寻常的用例。
假设我有一个实体类Foo:
@Entity
public class Foo {
@Id
private Long id;
private String bar;
@Transient
private long bazz;
...
}
我还定义了一个Interceptor,以便在从数据库中读取Foo的实例时初始化Foo.bazz:
public class MyInterceptor extends EmptyInterceptor {
...
@Override
public boolean onLoad(
Object entity,
Serializable id,
Object[] state,
String[] propertyNames,
Type[] types) {
if(entity instanceof Foo) {
Foo foo = (Foo)entity;
long bazzValue = ... // some very heavyweight code
foo.setBazz(bazzValue);
}
return false;
}
...
}
到目前为止,这么好。但并非所有代码路径都需要每个Foo实例的bazz字段的值。这意味着有时会不必要地调用为每个Foo实例找到值的重量级代码。
除非实际调用Foo.getBazz(),否则如何避免调用代码来查找bazz的值?
答案 0 :(得分:0)
好的,经过反思:
使用拦截器将对象填充到Foo实例中。这个对象可以进行延迟初始化而不会违反关注点的分离。