如何在Java中初始化聚合和组合的类字段?

时间:2013-06-12 09:59:52

标签: java aggregation composition

如果我有以下课程Foo,其中Bar也是一个班级:

public class Foo {
    private Bar baz;

    public Foo() {
    }
}  

我是否正确地认为,如果我初始化baz声明它的地方我会在FooBar之间建立一个总体关系,如果我在baz中初始化Foo {1}}的构造函数我将有一个复合关系?像这样:

聚合(我认为这可能不正确?):

public class Foo {
    private Bar baz = new Bar();

    public Foo() {
    }
}  

组合:

public class Foo {
    public Foo() {
        baz = new Bar();
    }
}  

我对Java有点新鲜,并且看到一切都是一个类,我很难想象(特别是)聚合关系如何工作,除非我做baz static。如果我在其他地方创建baz并将其传递给Foo的构造函数,那么baz是否只是其他类的复合?有点困惑。

2 个答案:

答案 0 :(得分:1)

尝试详细了解dependency injection。这是你在最后一句话中描述的内容。它是一种模式,可以删除两个示例中的硬编码依赖项,但此作业将委派给更高级别的权限。

你会得到类似的东西:

public class Foo {

    private Bar baz;

    public Foo(Bar baz) {
        this.baz= baz;
    }
}

可以在编译和运行时更改baz的实际实例。

实际的组合意味着没有Foo类,Bar类没有任何意义(或值),没有Foo它就不存在, - Bar“是Foo的一部分。一个例子是:IMEI号码是电话的一部分。

聚合告诉Foo只拥有Bar, - Bar“拥有”Foo。一个例子是:电池是手机的一部分。其他不是手机的设备也可能有电池。

这两个概念与编码方式没有太大关系。

答案 1 :(得分:0)

作文

final class Car{  

  private final Engine engine;  

  Car(EngineSpecs specs) {  
    engine = new Engine(specs);  
  }  

  void move() {  
    engine.work();  
  }  
}  

聚合

final class Car {  

  private Engine engine;  

  void setEngine(Engine engine) {  
    this.engine = engine;  
  }  

  void move() {  
    if (engine != null)  
      engine.work();  
  }  
}