以下代码如果没有组成,那么如何使它复合?

时间:2018-06-15 21:22:33

标签: java oop composition relation

刚开始学习OOP概念,我在关系,聚合和组合方面有点困惑 我想知道以下代码是否为Composition

class Person {

String name;
Dob dob;

public Person(String name, int date, String month, int year) {
    this.name = name;
    dob = new Dob(date, month, year);
}

public String getName() {
    return name;
}

public Dob getDob() {
    return dob;
    }

}
class Dob {

int date, year;
String month;

public Dob(int date, String month, int year) {
    this.date = date;
    this.year = year;
    this.month = month;
}

@Override
public String toString() {
    return date + " " + month + " " + year;
}

}
public class JavaApplication6 {

public static void main(String[] args) {

    Person person = new Person("omar", 4, "march", 1996);

    System.out.println(person.name + " " + person.dob);

}

}

如果不是通过考虑相同的例子如何实现它 谢谢你

1 个答案:

答案 0 :(得分:1)

聚合和组合使我思考UML概念:第一个是实体与另一个实体之间的强关系,而第二个是实体与另一个实体之间更强的关系。 例如,合成器删除触发组合关系中的组合实体的删除,但不会在聚合关系中删除。

在Java中,只有组合的概念是常用的,它并不意味着相同的东西 这意味着一个对象/类由另一个组成。它是包装器的同义词 我们经常反对继承。

在您的情况下,Person不会从Dob继承,而是拥有Dob字段。所以它组成/包装它。

UML组合不一定非常容易在Java对象方面进行翻译 使用ORM时更自然,行删除和on delete cascade的概念是有意义的。

对于普通Java对象,删除/收集对象由垃圾收集器(GC)执行 因此,当Dob实例被另一个对象引用时,它将处于活动状态 为了确保删除它,您应该使Dob字段不能被任何其他对象访问,除了组成它的Person实例。 要实现此目的,您可以删除返回Person实例的Dob中的getter 通过这种方式,只要Person有资格被GC收集,Dob实例也只会被Person对象引用。