私は次の質問の答えを調べていました:
答えの1つは次のとおりです。
ランタイム環境はプロキシ オブジェクトをいじる可能性があり、プロキシ自体とその背後に隠れているビジネス オブジェクトを誤って比較しようとするリスクが常にあります。比較すると、ランタイムから戻って見えます(そしてプロキシを取得します)。
誰でもこれを詳しく説明できますか?(私はこの行を 1000 回読みましたが、これを理解できませんでした)。
私は次の質問の答えを調べていました:
答えの1つは次のとおりです。
ランタイム環境はプロキシ オブジェクトをいじる可能性があり、プロキシ自体とその背後に隠れているビジネス オブジェクトを誤って比較しようとするリスクが常にあります。比較すると、ランタイムから戻って見えます(そしてプロキシを取得します)。
誰でもこれを詳しく説明できますか?(私はこの行を 1000 回読みましたが、これを理解できませんでした)。
次のサービス インターフェイスがあるとします。
public interface Phone {
void call(String number, PhoneListener listener);
}
そして具体的な実装:
public class PhoneImpl implements Phone
@Override
public void call(String number, PhoneListener listener) {
// perform the phone call
// chat
// tell the listener that the call is complete
listener.callEnded(this);
}
}
ここで、クラスがあるファクトリから 2 つのインスタンスを取得し、このファクトリが実際にプロキシを返すとします。これは、すべての通話がこのプロキシによって記録される必要があるためです。
public class PhoneHouse {
public static void main(String[] args) {
Phone phone1 = PhoneFactory.getPhone("phone1");
Phone phone2 = PhoneFactory.getPhone("phone2");
PhoneListener listener = new PhoneListener() {
@Override
public void callEnded(Phone phone) {
if (phone.equals(phone1)) {
System.out.println("A call ended with phone 1");
}
else if (phone.equals(phone2)) {
System.out.println("A call ended with phone 2");
}
}
};
phone1.call("012345678", listener);
phone2.call("098765432", listener);
}
}
さて、画面には何が表示されるでしょうか?
リスナーのcallEnded()
メソッドに渡される電話はインスタンスPhoneImpl
ですが、phone1
とphone2
のインスタンスをラップするプロキシであるため、答えは何もありませんPhoneImpl
。