我正在阅读this article中的代理模式,并理解了这个例子,但this comment让我很困惑。评论指出:
代理有两个大问题,特别是在企业环境中。
1)您无法进行自我调用。一个很好的例子是执行事务管理或安全性的代理。因此,您需要确保将呼叫转发给代理,而不是进行自我呼叫。这使得简单的类很复杂。
2)身份存在问题;一个好的examlpe是一个hibernate代理,它使得无法进行引用比较,即使你得到了会话中没有同一实体的多个对象实例的保证。
我的问题:
答案 0 :(得分:4)
“自我调用”是指使用otherMethod()
代替var.otherMethod()
在同一对象上调用方法。由于对同一对象的调用直接通过this
而不是代理,因此代理将应用的任何特殊处理都不会发生。
运行时环境可能会乱用代理对象,并且您总是冒着意外尝试将代理本身与隐藏在其后面的业务对象进行比较的风险,就像对象通过{{引用某个地方,有人试图比较它从运行时查找它(并获取代理)。