構築に費用がかかり、その中の最終変数にアクセスする必要がある匿名の内部型を作成する必要があります。問題は、使用される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メソッドは、元のオブジェクトに対するすべてのメソッド呼び出しの前に自動的に呼び出され、そのオブジェクトが初期化されているかどうかを確認し、初期化されていない場合は逆シリアル化します。その後、元のオブジェクトで呼び出されたメソッドを呼び出します。
具体的なユースケースを確認したい場合は、次を参照してください。