0

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;
}

どちらの場合も、親は必要な場合にのみ作成されます。

4

2 に答える 2

0

次のコード スニペットは、実装を「遅延」にします。

private Object target;
public Object invoke(Object proxy,
                     Method method, Object[] args)
              throws Throwable {
    if (target == null) {
        target = loadObject();
    }

このコードを何度呼び出しても、毎回同じオブジェクトが得られることがわかります。したがって、実際にはシングルトンです。ただし、プログラムの最初に作成されるのではなく、最初に必要になったときにのみ作成されます。これがここでの「怠け者」の意味です。

于 2013-06-21T05:20:14.400 に答える