我在接受采访时被问到以下问题,我很想知道答案。
以下是两个课程,
public class EmployeeA{
public int empId;
}
public class EmployeeB{
private int empId;
public void setEmpId(int empId){this.empId = empId;}
public int getEmpId(){return empId;}
}
有两个类,其中一个类具有公共实例字段,另一个类具有包含getter和setter的私有字段。在这种情况下,哪个更好实现,为什么? [我已经了解到将实例变量设为私有是更好的主意。但在这两种情况下,我都可以修改 empId 属性的值。 ]
答案 0 :(得分:3)
他们可能正在寻找的单词答案是" encapsulation"。
通过封装私有字段值,您可以更改将来如何设置/检索值的逻辑。比如说,你想要在集合上验证并过滤检索(get)。通过封装该值,您可以创建一个API,以便更好地进行维护。
答案 1 :(得分:1)
可能有点偏离主题,尽管人们通常会谈论"封装"在谈论" getter / setter"," getter / setters"实际上还远远没有适当的封装。
这个着名的" why getter and setter methods are evil"是值得一读的东西。当我们说吸气剂和制定者是邪恶的时,并不意味着我们应该直接暴露变量。它是通过在类中提供有意义的行为来进一步隐藏内部数据,而不是为属性提供访问器。虽然有很多情况我们仍然需要访问器,但在设计时这是值得注意的事情。
回到你的问题,如果是我,我会回答:提供getter和setter提供最低级别的封装,并允许我们在设置和获取属性时做额外的工作或派生数据。但是,为了进行适当的封装,我宁愿设计Employee类来提供正确的行为,而不是仅仅作为一个只提供一堆getter / setter的值对象。
答案 2 :(得分:0)
accesssor(getter)和mutator(setter)是JavaBean的要求,但并非Java中的所有类都必须遵循此设计模式。为什么不通过使用带有id的构造函数(甚至更好的静态工厂)来创建这个类是不可变的。然后,您可以为id提供访问者。这通常不是一个好主意,能够改变一个对象的id,如果id在Map中用作键并且你改变它,祝你找到对象好运...让类不可变解决这种问题问题。