聚合打破了封装

时间:2012-12-11 07:46:34

标签: java encapsulation aggregation

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

增强松散耦合。

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

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

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

我的理解是否正确?

2 个答案:

答案 0 :(得分:1)

在这里,松散耦合的目标是Car&发动机。

虽然汽车通过其构造函数接受任何引擎,但我相信,汽车不会通过getter方法暴露引擎。

此构造函数应具有适当的访问控制/级别,并由工厂或其他创建模式使用,该模式负责将引擎与汽车集成。

允许Car的客户访问引擎应该通过Car的界面。

答案 1 :(得分:1)

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

你是对的:这不是现实世界的例子:在现实世界中,驱动程序通过他的汽车提供的界面控制引擎并且可以打破引擎:(