[英]Best Approch of Returning Value from 'getter' Method
“将类字段/属性设为私有” -是OOP中的最佳做法之一。 要访问private
字段/属性,我们可以使用公共getter方法。 但是根据此博客,仅编写getter方法可能不够用(请参阅Quote 2) 。 它建议从getter方法返回字段/属性的副本(如果它是引用类型)。 通过遵循这种方法,我们可以使字段/属性不可修改。 请参见下面的代码-
public class Department{
Employee admin;
...
...
...
public Employee getAdmin(){
return admin.clone();
}
}
因此,从现在开始,如果我们不使用任何setter,那么'admin'
将无法被外部世界修改。 这种方法看起来非常不错。 但是我几乎找不到任何实现此方法的代码。 使用此方法是否有任何缺点,可能会削弱使用此方法的好处?
提前致谢。
这种方法的主要缺点是每次获取对象时都需要进行克隆,这是不理想的,因为理想情况下,您希望自己的吸气剂轻巧。
有两种方法无需克隆即可达到相似的效果:
Employee
一成不变,并且 Employee
一个不变的界面 第一种方法是不言自明的,非常有效,但是并不总是实用的,尤其是在对象表示需要在适当位置共享的状态的情况下。
第二种方法也很简单:而不是让Employee
一类,使其与干将只有一个接口,使类EmployeeImpl
实现Employee
,并有getter和setter,并使用类,当你需要的可变性。
public interface Employee {
String getFirstName();
String getLastName();
}
public class EmployeeImpl implements Employee {
private String firstName;
private String lastName;
public String getFirstName() {return firstName;}
public String getLastName() {return lastName;}
public void setFirstName(String name) {firstName = name;}
public void setLastName(String name) {lastName = name;}
}
这种方法可以通过强制转换为类来克服,但是大多数时候都是可以的。
如果您处于敌对环境中,对实际对象的任何修改都是极其有害的-例如,您正在公开一些可供所有人下载和使用的服务API,则必须采用您描述的完整克隆方法。 但是,这种情况很少见。
注意:自首次发布以来,我更改了此答案。 我建议的第一个解决方案存在继承问题,现在可以解决。
通常,克隆返回的对象是一个非常糟糕的选择。 除非对象非常简单,或者除非您的应用程序不是非常复杂,否则所有这些克隆很可能会带来大量开销。
针对您的特定情况的替代方法是拥有一个名为Employee
的接口,该接口仅提供获取器。 然后,您还可以定义实现Employee
并提供设置器的MutableEmployee
类。
interface Employee {
public String getName();
public float getSalary();
}
class MutableEmployee implements Employee {
private String name;
private float salary;
@Override
public String getName() {
return name;
}
@Override
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
super.salary = salary;
}
public void setName(String name) {
super.name = name;
}
}
然后,您的Department
类将进行如下修改:
class Department {
private MutableEmployee admin;
public Employee getAdmin() {
return (Employee) admin;
}
public MutableEmployee getMutableAdmin() {
return admin;
}
}
定义MutableEmployee
子类
当您想要创建MutableEmployee
的子类(如MutableGraphicDesigner
,需要定义以下内容:
interface GraphicDesigner extends Employee
class MutableGraphicDesigner extends MutableEmployee implements GraphicDesigner
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.