繁体   English   中英

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

[英]What is a good way to implement composition in Java?

以下类显示了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;
}

我的问题是:如果我想从“人员”那里获得薪水,以下两种选择中哪一种是更好的做法?

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();
    }
}

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

老实说,我坚持认为方法1不能以任何方式被认为是不好或错误的事实,在通常情况下它只有很小的缺点...

通常,个人而言,我喜欢方法1,因为每次重定向(如何称呼它正确吗?)都会使代码稍微复杂一点。 想象一下,整个代码对每个关系都有重定向。 甚至更难沟通:“您是说Person.Salary还是Person.Job.Salary?”。

但是在您的示例中,我更喜欢方法2,因为我可以想象将Person扩展为具有多个工作或养老金之类的工作。

有一个“法律”说应该避免选择1号,这是Demeter的法则又称最小知识原理

尤其是

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

HTH,卡洛

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM