我正在阅读以下问题的答案:
答案之一是:
运行时环境可能会摆弄代理对象,并且您总是冒着意外尝试将代理本身与隐藏在其后面的业务对象进行比较的风险,例如对象在某处传递 this 引用而有人试图比较它从运行时查找它(并获取代理)。
谁能详细说明一下?(我已经阅读了这行 1000 次但无法理解这一点)。
我正在阅读以下问题的答案:
答案之一是:
运行时环境可能会摆弄代理对象,并且您总是冒着意外尝试将代理本身与隐藏在其后面的业务对象进行比较的风险,例如对象在某处传递 this 引用而有人试图比较它从运行时查找它(并获取代理)。
谁能详细说明一下?(我已经阅读了这行 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);
}
}
现在假设一个类从某个工厂获取两个实例,并且这个工厂实际上返回了一个代理,因为每个电话都应该由这个代理记录:
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
。