如果Class只有getter和setter,为什么Java中的实例变量应该是私有的

时间:2014-11-04 03:44:25

标签: java oop

我在接受采访时被问到以下问题,我很想知道答案。

以下是两个课程,

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 属性的值。 ]

3 个答案:

答案 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中用作键并且你改变它,祝你找到对象好运...让类不可变解决这种问题问题。