[英]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.