java - 聚合打破了封装

标签 java encapsulation aggregation

我一直在阅读书籍,试图了解聚合和组合的各个方面。但是我遇到了一点,我觉得聚合可以增强松散耦合,但也可以破坏封装。

增强松耦合。

public class Car{
    private Engine engine;
    Car(Engine e){
        this.engine=e;
    }
}

在上面,可以创建 Engine 类的任何实现并在创建时将其推送到 Car 对象,并且由于 Engine 实例可以在没有汽车的情况下存在,因此它是聚合的完美示例。 (这个例子可能不是一个很好的现实世界的例子,但我想我表达了我的观点)

现在客户端代码可以完全控制引擎对象,因此它可以更改传递给 Car 的引擎对象的一些状态,而 Car 的实现会破坏封装,因为它的对象或状态(即引擎)是 no more 在汽车中具有正确的完整性。

我的理解正确吗?

最佳答案

Engine 只有在可变的情况下才能被 Car 破坏,即 car 可以改变引擎的状态。但是,您可以定义不可变类 Engine(仅具有访问状态的 getter 和不更改状态的业务方法)或创建由类 EngineImpl 实现的接口(interface) Engine EngineImpl 不是不可变的。它包括可以改变其状态的功能。然而,它实现了仅向客户端公开“不可变”方法的接口(interface)Engine。因此,car 无法更改隐藏在只读接口(interface) Engine 后面的 EngineImpl 的状态。在这种情况下,封装没有被破坏。

你是对的:这不是现实世界的例子:在现实世界中,司机通过他的汽车提供的接口(interface)控制引擎,并且可以破坏引擎:(

关于java - 聚合打破了封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13815771/

相关文章:

java - 封装问题

elasticsearch - Elasticsearch直方图聚合-偏移间隔桶

mongodb - Mongodb 聚合管道对嵌套数组对象值进行排序

java - 是否有类似 IF NOT EXISTS 的命令用于插入值?

java - 将 List<MyType> 重组为 List<List<MyType>>

java - 你能在struts-config.xml中使用正则表达式吗?

java - 如何在我的 SWT 应用程序上使用 IBM 的小部件 (com.ibm.rcp.swt.swidgets)?

java - 这是对这段 Java 代码的正确封装吗?我很困惑

c# - 如何封装只适用于少数方法的私有(private)字段

mysql - 如何根据另一列的值获取单行值?