如何在java中实现类的自关联?

时间:2014-05-11 14:33:33

标签: java class oop uml class-diagram

我有两个类Person和Company,其中的关联指定如下:

(1)为公司工作的人

(2)人(老板)通过评级管理人(工人)。

此图片中提供了详细信息: enter image description here

如果是第一次关联,我就这样做了:

class Person {
    Company co;
    String name, ssn, addr;
}

class Company {
    String name, addr;
}

class WorksFor {
    Person person;
    Company com;
    int sal;
    String title;
}

这是正确的实施吗?我也对第二次关联感到困惑。请帮助我提出宝贵的建议。

3 个答案:

答案 0 :(得分:2)

通常,模型中的类(与数据相关联的类)与现实世界的对象相关。并且通常的做法是使用名词调用类,因此我将WorksFor更改为其他内容。

class Person {
    String name, ssn, addr;
    Job job;
    Person boss;
}

class Company {
    String name, addr;
}

class Job {
    Company co;
    int salary;
    String title;
}

上面代码的问题是评级和获得老板的工作人员 - 它可以通过多种方式解决。假设每个老板也是一个工人,你可以扩展Person类:

class Boss extends Person {
    List<Person> workers;
}

另一种可能性是保留Person的工人列表 - 如果一个人不是老板,列表将为空/ null。


绩效管理的一些想法在KonradOliwer answer中给出,我不打算复制它。

答案 1 :(得分:1)

不是。

你应该知道,如果类与某些东西有关联,那么它就像属性具有给定基数的类型。

所以例如Person会给出字段(省略关联类):

String name[1]
String ssn[1]
String addr[1]
Company company[1]
Person boss[0..*]
Person worker[1..*]

然后如何将这些更改为java:

String name;
String ssn;
String addr;
Company company;
List<Person> bosses;
List<Person> worker;

但请记住,如果需要给定类型的数量,则应在构造函数中传递这些元素。 值得一提的是:如果省略UML值则意味着[1]。 所以我们需要有一个以worker为参数的构造函数。

通过关联类,事情变得更加复杂: 你应该创建类似

的类
class Performance {
    Person boss;
    Person worker;
    int performanceRating;

    public Performance(Person boss, Person worker, int performanceRating){
        this.boss = boss;
        this.worker = worker;
        this.performanceRating = performanceRating;
    }
}

亲自将这些人员列表更改为绩效列表。

它仍然是无效的UML图表,因此我不能完全确定我的答案是否有帮助。

答案 2 :(得分:1)

可以这样做:

class Person {
   EmploymentRelationship employmentRelationship;
   List<ManagementRelationship> workerManagementRelationships;
   ManagementRelationship bossManagementRelationship;
   String name, ssn, addr;
}

class Company {
   String name, addr;
}

class EmploymentRelationship {
   Person person;
   Company com;
   int sal;
   String title;
}

class ManagementRelationship {
   int performanceRating;
   Person boss;
   Person worker;
}