【问题标题】:Best way to bring access of a private instance to an external class将私有实例的访问权带到外部类的最佳方法
【发布时间】:2020-07-02 10:17:14
【问题描述】:

首先,不确定这里的主题标题。抱歉,如果它与我的要求不符。

我的情况是,我有一些想法,但我不知道其中一个是否比另一个更好,也许我错过了一些东西。事情是这样的:

目前我有一个实例 A 创建另一个类 B 的实例,并使用实例 B 的回调(通过由类 A 实现的回调类),并使用此回调通知类 C 的另一个实例,也在 A 类和私有内部创建。这是一个摘要图:

现在,将来由于某种原因,它是 D 类的另一个对象,它需要创建并保留 B 类的对象。问题是当我有回调时仍然需要通知对象 C来自 B 对象。当然,C 实例不能从 A 移动到 D。所以,从 D 开始,我没有 A 实例,也没有 B 实例,而且我不知道最好的方法。这是 D 类的另一个图表:

这与第一张图基本相同,只是最后一次调用 (notifySomething()) 是假设的,因为我无法从 D 类访问 C 实例。

有人遇到过这种情况吗?最好的解决方法是什么?

谢谢!

【问题讨论】:

  • A 和 D 的最大区别是什么?因为您可以简单地对 A 进行 D 扩展并将 registerListenernotifySomething 函数更改为 protected。这样,D 也可以从 A 访问变量和方法,以通知 C。我可能在这里没有正确理解,但这就是我会做的。
  • 为什么不在两者之间使用一个对象?管理与 B&C 的通信并充当 A|D 的代表的对象...
  • @Nicolas,A 和 D 有完全不同的任务,因此 D 扩展 A 是不合逻辑的
  • @Jean-BaptisteYunès,我想过,但我真的不知道如何在我的情况下实施它(我试图成为我的问题中最普遍的,但该项目实际上非常具体. 谢谢)
  • 我认为 jaco0646 的答案在这种情况下是最好的。

标签: java algorithm performance oop security


【解决方案1】:

AD一个工作:执行业务逻辑(当它们的回调方法被调用时)。

考虑到这一点,AD 正在尝试执行三个不属于它们的不相关任务。其他东西(可能是 DI 容器)需要负责这些任务。

  1. 依赖管理:AD 不应该关心它们的依赖是如何实例化的。其他东西应该负责实例化B。创作不是AD 的工作。
  2. 监听器注册:AD 不应该关心谁在调用他们的回调方法。其他人应该负责将AD 注册到B。注册不是AD 的工作。
  3. 监听器通知:AD 不应该关心还有谁需要来自 B 的通知。其他人应该负责将C 注册到B。通知不是AD 的工作。

一个解决方案...

将所有创建和依赖管理以及注册与您的其他对象分开,并将该逻辑放在自己独特的位置。那个地方被称为你的应用程序的composition root,你的其他对象都不应该尝试做组合根的工作。

目标是实现dependency inversion

【讨论】:

  • 感谢您的回答。我需要阅读更多关于依赖倒置的信息,这很有趣。
猜你喜欢
  • 2018-01-04
  • 2013-09-20
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
相关资源
最近更新 更多