我正在查看以下问题的答案:
其中一个答案是:
运行时环境可能会使用代理对象,并且 你总是冒着不小心试图比较代理的风险 本身隐藏在它后面的业务对象,就像在哪里 该对象将此引用传递到某个地方并且有人在尝试 比较它从运行时查找备份(并获取代理)。
任何人都可以详细说明这个吗?(我已经读了1000行但却无法理解这一点。)
答案 0 :(得分:1)
假设您有一个服务接口:
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
是包含{{1}实例的代理1}}。