0

クラスでフィールドを定義し、この特定のクラスで参照を使用できるソリューションを探しています。コードモデルは、フィールドをインスタンス化するためのメソッドを作成し、フィールドの使用法を作成されたメソッドに置き換える必要があります。

誰かが私を助けてくれることを願っています。

未処理クラス

public class MyClass {
    @LazyInit
    CustomClass member;

    public void someMethod() {
        System.out.println(member);
    }
}

codeModel 使用後のクラス

public class MyClass_ {
    @LazyInit
    CustomClass member;

    public void someMethod() {
        System.out.println(getInstanceOfMember());
    }

    public member getInstanceOfMember() {
        if (member == null)
            member == new CustomClass();

        return member;
    }
}
4

1 に答える 1

0

少し変更すると、この問題ははるかに扱いやすくなります。変数を抽象 getter メソッドに変更すると、基本クラスをそのままにして、生成されたクラスで遅延初期化を実行できます。これが私が意味することです:

入力クラス:

public abstract class MyClass {
    @LazyInit
    public abstract CustomClass getMember();

    public void someMethod() {
        System.out.println(getMember());
    }
}

生成されたクラス:

public class MyClass_ extends MyClass {

    private CustomClass member;

    public synchronized CustomClass getMember() {
        if (member == null){
            member == new CustomClass();
        }
        return member;
    }
}

この生成されたクラスを使用するには、直接インスタンス化するか、ユーティリティを使用します。

new MyClass_().someMethod(); // prints CustomClass.toString() (non-null)

また

Lazy.get(MyClass.class).someMethod() // same

注釈プロセッサとコード ジェネレータ (JCodeModel など) を使用してこれを実装するのは非常に簡単です。詳細が必要な場合はお知らせください。

于 2014-07-14T21:11:52.303 に答える