将 UML 图映射到 Java 代码转换

Mapping UML diagram to Java code conversion

您好,我正在尝试将此 UML 图直接转换为 java 代码,下面是我的代码,但似乎无法编译。我不太确定如何放置可选的多重性,例如0..* 和 0..1。谢谢你的帮助。

public class Person{
    private String name;
    private Person mom;
    private Person dad;
    private ArrayList<Person> child;
    private ArrayList<Person> friend;
    private ArrayList<School> alumni;
    private School current = new School();

    public Person(String name, Person mom, Person dad, ArrayList<Person> child, ArrayList<Person> friend, ArrayList<School> alumi, School current){
        name = this.name;
        mom = this.mom;
        dad = this.dad;
        child = this.child;
        friend = this.friend;
        alumni = this.alumni;
        current = this.current;
    }
}

public class School{
    private String name;
    private ArrayList<Person> student;

    public School(String name, ArrayList<Person> student){
        name = this.name;
        student = this.student;
    }
}

没有将 UML 转换为 Java 的标准化方法,但我可以根据 UML 和 Java 语义告诉您什么是正确的,什么是不正确的。

classes C1 和 C2 之间的关联可以通过 class C1 中的 属性 或 class C2 中的 属性 实现或按 classes 中的属性。如果关联没有箭头,则所有三个选项都是可能的,并且没有定义这三个选项中哪个是最好的。如果关联是从 C1 指向 C2 的箭头,那么第一个选项是最好的,第二个选项是错误的,第三个选项是允许的。我已经检查了您的 Java 代码,它符合这些规则。

如果 class C1 有一个 属性 P 实现 class C1 和 class C2 之间的关联,并且该关联的重数为 0..1在 C2 的一侧,那么 P 应该有 C2 类型,C1 应该有一个不初始化 P 的构造函数。你的 Java 代码不正确,因为你不应该初始化 Person.School.

如果重数是*0..*,那么P应该是C2的某种集合。 Class C1 应该有一个不初始化 P 或可以用空集合初始化 P 的构造函数。后者是您的 Java 代码中的情况。

public class Person{
    private String name;
    private Person mom;
    private Person dad;
    private ArrayList<Person> child;
    private ArrayList<Person> friend;
    private ArrayList<School> alumni;
    private School current = new School();

这部分似乎是正确的,除了 School 应该为空,因为该人目前可能不在学习。

private School current;

关键字this(参见Using the this Keyword)引用Java中的当前对象,所以构造函数应该写成

public Person(String name, Person mom, Person dad, ArrayList<Person> child, ArrayList<Person> friend, ArrayList<School> alumi, School current){
    this.name = name;
    this.mom = mom;
    ...
}

与学校同样的问题class:

public class School{
    private String name;
    private ArrayList<Person> student;

    public School(String name, ArrayList<Person> student){
        this.name = name;
        this.student = student;
    }
}

如果您在同一个文件中定义两个 class,您必须从学校的 class 定义中删除 public,然后

class School{

或移动到名为 School.java 的文件,请参阅 oracle.com/javase/tutorial/java/javaOO/nested.html