Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 聚合破坏了封装_Java_Encapsulation_Aggregation - Fatal编程技术网

Java 聚合破坏了封装

Java 聚合破坏了封装,java,encapsulation,aggregation,Java,Encapsulation,Aggregation,我一直在读一些书,试图理解聚合和组合的各个方面。但是我遇到了一个问题,我觉得聚合可以增强松散耦合,但也可以破坏封装 加强松耦合 public class Car{ private Engine engine; Car(Engine e){ this.engine=e; } } 在上面,引擎类的任何实现都可以在创建时创建并推送到Car对象,并且由于引擎实例可以在没有Car的情况下生存,因此它是聚合的完美示例。(这个例子可能不是一个很好的现实例子,但我想我已

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

加强松耦合

public class Car{
    private Engine engine;
    Car(Engine e){
        this.engine=e;
    }
}
在上面,引擎类的任何实现都可以在创建时创建并推送到Car对象,并且由于引擎实例可以在没有Car的情况下生存,因此它是聚合的完美示例。(这个例子可能不是一个很好的现实例子,但我想我已经说明了我的观点)

现在客户端代码完全控制引擎对象,因此它可以更改传递给汽车的引擎对象的几个状态,汽车的实现将打破封装,因为它的对象或状态(即引擎)在汽车中不再具有正确的完整性


我的理解正确吗

这里,松耦合是针对汽车和发动机之间的关系

虽然汽车通过其构造接受任何发动机,但我相信,汽车不会通过getter方法暴露发动机

该构造器应具有适当的访问控制/级别,并由工厂或其他负责发动机与汽车集成的创造性模式使用


允许汽车客户端访问发动机应通过汽车接口。

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


你是对的:这不是真实世界的例子:在真实世界中,驾驶员通过汽车提供的接口控制发动机,并可能损坏发动机:(

这取决于封装,你不想改变对象的状态,而想操作对象。因此,用发动机代替发动机。setOn(布尔值)您有engine.turnOn()。如果您只希望汽车能够在引擎上运行,那么在构造函数中您将克隆对象以限制访问。this.engine=(engine)e.clone();汽车上的其他操作可以被移除引擎,然后你可以访问引擎,但汽车不再有引擎。在我看来,我认为客户机无法控制引擎对象。我可以想象有一个更高级别的类,名为Manufacturer,它将创建正确的引擎对象,并将其设置为特定汽车对象的引擎等等。我认为他所指的是,创建汽车的过程会引用引擎,而引擎本不应该引用。@Vaibhav,我同意正确设计的类应该像您所说的那样,但在这种情况下,制造商成为客户,他只需在汽车运行c之后修改引擎对象的某些状态即可创建,然后car对象将被渲染为断开。你不这么认为吗?@BevynQ,然后我会想象整个引擎类是只读的。同意,+1对你来说。只是一个疑问,非常琐碎,一个可变的实现将断开汽车,而不是引擎,对吗?我想你没有领会我的意思,让我这么说吧。引擎e=new EngineImpl();Car c=新车(e);e.setSomethingongEngine();//这可能会破坏汽车的性能。setSomethingongEngine()通常不会由任何工厂或创意模式来完成。也许,制造商可以制造发动机,但在发动机被创建并注入汽车后,它不会改变发动机。如果是这样,那么创意模式代码违反了原则。