0

我希望这是一个不寻常的用例。

假设我有一个实体类 Foo:

@Entity
public class Foo {
    @Id
    private Long id;

    private String bar;

    @Transient
    private long bazz;

    ...
}

我还定义了一个拦截器,以便在从数据库中读取 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 的值?

4

1 回答 1

0

好的,经过反思:

使用拦截器将对象填充到 Foo 实例中。该对象可以在不违反关注点分离的情况下进行延迟初始化。

于 2013-08-30T15:35:28.383 回答