0

構築に費用がかかり、その中の最終変数にアクセスする必要がある匿名の内部型を作成する必要があります。問題は、使用されるfinal変数(オブジェクト自体とタイプ)が異なるという唯一の違いを除いて、それらの多くを作成する必要があることです。

より再利用可能な方法でこれを行うことは可能ですか?

簡単な例:

final Object aNeededParameter = "test";
Object expensiveToBuild = new ExpensiveInnerType() {
    public void doSomething() {
         aNeededParameter.toString();
    }
});

異なるオブジェクトに対して同時に高価なToBuildのインスタンスが必要です。たとえば、1L、new Date()、「別の同様のユースケース」などです。

基本的な考え方は、実行時に具象クラスのさまざまなシリアル化されたインスタンスのプロキシを作成し、最初の使用時にこのオブジェクトを逆シリアル化することです。実用的な例(下部のリンク)を作成しましたが、プロキシの作成には非常に費用がかかります。

バイトコード拡張を介してプロキシオブジェクトを作成するためにMethodHandlerを必要とするProxyFactoryがあります。MethodHandlerはメソッドを定義します

invoke(Object self, Method realMethod, Method proxyMethod, Object[] args) throws Throwable

私の場合、このメソッドは、プロキシが構築されているシリアル化されたオブジェクトを含むbyte[]にアクセスする必要があります。したがって、新しいMethodHandlerを作成し、プロキシが必要なオブジェクトごとに新しいProxyオブジェクトをビルド/コンパイルする必要があります。

invokeメソッドは、元のオブジェクトに対するすべてのメソッド呼び出しの前に自動的に呼び出され、そのオブジェクトが初期化されているかどうかを確認し、初期化されていない場合は逆シリアル化します。その後、元のオブジェクトで呼び出されたメソッドを呼び出します。

具体的なユースケースを確認したい場合は、次を参照してください。

Java用のレイジーデシリアル化プロキシ

4

3 に答える 3

4

匿名にしないでください。匿名クラスのポイントは、それらを再利用することを期待しない場合です。コンストラクターを介して必要なfinal変数をクラスに渡します。

他のオプションはdoSomething、匿名クラスを1回インスタンス化する場合に、コンストラクターの代わりにパラメーターを取得できるようにすることです。それでも匿名ではなく、親クラスが所有する必要がありますが、これにより、使用できるオブジェクトは1つだけになります。これが良い設計であるかどうかは、詳細によって異なります。

于 2012-11-28T20:19:03.837 に答える
1

匿名の内部クラスが、変更されるオブジェクトのラッパー クラスのインスタンスを参照するようにします (たとえば、ラッパー クラスのインスタンス変数の 1 つがオブジェクト型であり、必要に応じてその変数を変更するだけです)。

于 2012-11-28T20:22:44.110 に答える
1

ということですか

final Object[] param = { null };

Foo foo = new Foo() 
    void invoke() 
        use param[0]

param[0] = objA;
foo.invoke();

param[0] = objB;
foo.invoke();
于 2012-11-28T20:23:25.980 に答える