AOP に動的プロキシが使用されていることしか知りませんでした。
ただし、遅延読み込みにも使用できるようです。
記事からの次の例は、それを示すことを目的としています。
ただし、これが通常のアクセサーとどのように異なるのか、ここで「遅延」ロードされているのは正確には何ですか?
作成者が遅延読み込みによって何を意図したかを理解するための助けをいただければ幸いです。
private Category tupleToObject(Serializable[] tuple) {
Category category = new Category((String)tuple[1],
(YearMonthDay) tuple[2]);
category.setId((Long) tuple[0]);
category.setParent(lazyGet((Long) tuple[3]));
return category;
}
protected CategoryItf lazyGet(Long id) {
if (id == null) {
return null;
}
return (CategoryItf)Proxy.newProxyInstance(
CategoryItf.class.getClassLoader(),
new Class[] { CategoryItf.class },
new LazyLoadedObject() {
protected Object loadObject() {
return get(id);
}
});
}
public abstract class LazyLoadedObject implements InvocationHandler {
private Object target;
public Object invoke(Object proxy,
Method method, Object[] args)
throws Throwable {
if (target == null) {
target = loadObject();
}
return method.invoke(target, args);
}
protected abstract Object loadObject();
}
これは、次のものとどのように異なるでしょうか。
private Category tupleToObject(Serializable[] tuple) {
Category category = new Category((String)tuple[1],
(YearMonthDay) tuple[2]);
category.setId((Long) tuple[0]);
category.setParent(get((Long) tuple[3]));
return category;
}
どちらの場合も、親は必要な場合にのみ作成されます。