gpt4 book ai didi

java - 按照正确的 OO 设计使用另一个对象的功能 - 封装

转载 作者:行者123 更新时间:2023-11-30 05:15:52 26 4
gpt4 key购买 nike

我正在讨论正确的面向对象设计,以使用 java 类中的另一个对象的功能(方法),同时两个对象尽可能保持解耦。

例如,在我的类中的某个时刻,为了实现我的逻辑,我需要调用属于另一个对象(例如辅助类)的方法。这个帮助器类不需要以任何方式与我的原始类相关,它只是有一个对我的类可见且可供我的类使用的特定方法。

逻辑实现后,就不需要辅助方法(或辅助对象)了。

显然,我需要对此辅助对象的引用才能使用其方法。但是为了强制封装,我不应该在原始类中声明一个实例变量来引用这个辅助对象吗?这个推理正确吗?此外,帮助程序类不知道任何可能使用它的客户端类。

在这种情况下局部变量会更合适吗?在将使用其功能的方法中声明并实例化辅助对象?我的原始类中声明和实例化此类辅助对象的最佳位置在哪里?

我想知道是否有一个高级示例,或者是否在 OO 文章中对此进行了更详细的解释。我很感激任何以封装为中心的输入或上面的提示。

最佳答案

But to enforce encapsulation, I should not declare an instance variable in my original class to reference this helper object? Is that reasoning correct?

不,声明实例变量与破坏封装无关。

相关考虑因素是:

  • 依赖:默认情况下,您依赖于您使用的实用程序类,但它不依赖于您。如果需要,可以使用各种技术(例如接口(interface)、策略模式、依赖注入(inject))来逆转或减少这种依赖。但在简单的情况下,依赖它可能就可以了。
  • 对象生命周期:如果它是一个对象,则需要它在使用时存在。它的存在可能在语义上意味着某些东西(即改变程序其他部分的行为),或者可能具有性能影响(创建它的成本很高,或者如果在不需要时闲置则占用大量内存)。因此,您需要一种与其本质和您的目标相兼容的处理其生命周期的方法。

基本选择是:

  • 本地非共享变量在一个或更多你的功能 - 它是在需要时创建,消失一旦函数退出。可能是默认选择,其他一切都是优化或特殊情况。
  • 创建的共享实例变量构造函数 - 仅创建一次,但是持续到你的对象本身得到垃圾已收集/销毁。
  • 首次创建共享实例变量使用 - 如上所述,但延迟以复杂性为代价进行创作。
  • 外部静态函数 - 没有对象,因此没有生命周期问题。适合没有内部状态和简单接口(interface)的东西,否则你最终会拥有一个仅由函数注释管理的隐式对象生命周期(如 strcpy 之类的 C 库函数)。

高级选择:

  • 外部单例 - 对象管理它自己的生命周期,保证一个将可用你。对于某些事情来说工作正常,但是很可能过度使用。
  • 依赖注入(inject) - 其他人(通常是框架管理的通过配置文件)打破了你的封装并放入对象中你会需要的。

执行此操作的所有其他方法(例如,将对象添加到构造函数或方法参数)都会向系统添加额外的依赖项,因此除非至少上述基本选择不合适,否则不应该这样做。

关于java - 按照正确的 OO 设计使用另一个对象的功能 - 封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1351157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com