在Java中实现组合的好方法是什么?

时间:2014-12-13 17:51:22

标签: java composition

以下类在Java中显示Composition的概念:

//Imagine constructors, accessors & mutators has already been created..

class Person{
    private String name;
    private Job job;    //Person has Job
}

class Job{
    private String name;
    private double salary;
}

我的问题是:如果我想从Person获得薪水,以下哪两个选项是更好的做法?

1。找人的工作,然后从人的工作中获得工资

System.out.println( person.getJob().getSalary() );

或者

2。亲自创建一个getSalary方法,所以我可以这样做:

System.out.println(person.getSalary());

创建一种从工作中获得薪水的方法。

class Person{
    private String name;
    private Job job;
    public static double getSalary(){    //Is doing this redundant and bad practice?
        job.getSalary();
    }
}

3 个答案:

答案 0 :(得分:1)

方法2比方法1好一点,因为从一个人获得薪水的代码不依赖于任何类型的Person->Salary关系实现。您可以自由更改薪水的计算方式。在现实生活中,你可以问一个人什么是薪水而不了解他的工作。在你的代码中,骗子甚至可以为他返回想象中的薪水等等。

老实说,我坚持认为方法1不能以任何方式被视为坏或错,在常见情况下它只有一点点缺点......

答案 1 :(得分:0)

一般而且我个人喜欢方法1,因为每次重定向(如何调用这个?)会使代码变得更复杂一些。想象一下,整个代码对每个关系都有重定向。即使它更难沟通:'你的意思是Person.Salary还是Person.Job.Salary?'。

但是在你的例子中,我更喜欢方法2,因为我可以想象扩展Person除了养老金之外还有多个工作或工作。

答案 2 :(得分:0)

有一个"法律"说应该避免使用1号选项,它是Demeter's law又名最少知识的原则

特别是

  

对象 A 可以请求对象的服务(调用方法)   实例 B ,但是对象A不应该通过"对象 B   访问另一个对象 C ,以请求其服务

HTH, 卡罗