次のようにインスタンスを手動で作成するときに、匿名クラスを作成できることはわかっています。
ClassName c = new ClassName() {
public void overridenMethod() { method body }
}
ただし、一部のクラスはビルダー パターンを使用して新しいインスタンスを作成します。私の質問は、スーパークラスによって提供されるビルダーを使用して匿名クラスを作成できるようにするトリックがあるかどうかです。
次のようにインスタンスを手動で作成するときに、匿名クラスを作成できることはわかっています。
ClassName c = new ClassName() {
public void overridenMethod() { method body }
}
ただし、一部のクラスはビルダー パターンを使用して新しいインスタンスを作成します。私の質問は、スーパークラスによって提供されるビルダーを使用して匿名クラスを作成できるようにするトリックがあるかどうかです。
いいえ、または少なくとも直接ではありません。Java では、インスタンスから継承することはできません。クラスから継承する必要があります。
ただし、ビルダーから返されたインスタンスをラップする匿名クラスを構築することはできます。オーバーライドする必要があるメソッドをオーバーライドしながら、必要に応じてラップされたインスタンスのメソッドを呼び出すことができます。
final ClassName wrapped = builder.buildClassName();
ClassName c = new ClassName() {
public void passedThroughMethod1() { wrapped.passedThroughMethod1() }
public void overridenMethod() { method body }
public void passedThroughMethod2() { wrapped.passedThroughMethod2() }
};
この時点で、はインスタンスとc
同じように動作しますが、 . 残念なことに、 の保護されたメンバーにアクセスできません。wrapped
overridenMethod
wrapped
私が質問を正しく理解している場合は、ビルダーが匿名型のインスタンスを返すようにします。その場合はcreate
、ビルダーが新しいインスタンスを作成するために呼び出す基本クラスにメソッドを追加します。派生クラスcreate
では、匿名クラスのインスタンスを返すようにオーバーライドします。これは、ビルダーが基本クラスのインスタンスにアクセスできることを前提としています。別のメカニズムはSupplier
、ビルダーにを提供することです。