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