【问题标题】:Mapping UML diagram to Java code conversion映射 UML 图到 Java 代码转换
【发布时间】:2020-01-18 22:06:45
【问题描述】:

您好,我正在尝试将此 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;
    }
}

【问题讨论】:

  • 我不会说 Java,但这看起来没问题,除非你不能在 Person 中实例化 School,因为它可以是 NULL 或 NIL(或在 Java 中调用的任何内容)。
  • 大声笑 - 你使用的绘图工具是什么? School 倾斜了几度。
  • emmm 我用的是图像扫描仪应用程序,它在纸上,所以我想这就是原因

标签: java uml multiplicity


【解决方案1】:

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

类 C1 和 C2 之间的关联可以由类 C1 中的属性实现,或由类 C2 中的属性或由两个类中的属性实现。如果关联没有箭头,则所有三个选项都是可能的,并且没有定义这三个选项中哪个是最好的。如果关联是从 C1 指向 C2 的箭头,则第一个选项最好,第二个选项不正确,允许第三个选项。我检查了你的 Java 代码,它符合这些规则。

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

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

【讨论】:

  • 这意味着,如果 c1 有 0...1 c2,那么 c1 应该保留一个 C2 类型的 P 并且有一个不需要 P 的构造函数,如果它是 0..* ,然后要么在没有 P 的情况下构造,要么使用空集合构造。在那种情况下,是否还需要包含一个包含 P 的构造函数以用于 0..1 的情况?
  • 不,不需要这样的构造函数。
【解决方案2】:
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;
    ...
}

School 类有同样的问题:

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

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

如果你在同一个文件中定义两个类,你必须从 School 的类定义中删除 public,然后变成

class School{

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

【讨论】:

  • 感谢您指出“this”,在这种情况下,我可以假设如果它不是强制性的 1,那么我不会在我的属性中实例化它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 2012-10-05
  • 1970-01-01
  • 2015-03-05
  • 2019-06-12
  • 1970-01-01
相关资源
最近更新 更多