实例是否应该使用setter / getters来访问自己的私有数据成员?

时间:2014-02-16 04:54:43

标签: java c++ class oop

从每个入门编程课开始,我们都被教导使用访问器和setter而不是暴露类的内部工作。学生们将在晚些时候了解练习的重点,但现在我明白这种做法(A)可以防止实施成为合同导出API的一部分,(B)改进封装和数据隐藏,(C)允许保证在设置或访问变量时是否应该发生某些操作(增加计数器,记录某些内容等)。

如何在实例中使用getter / setter?例如,

class A {
  private:
    int number = 43;
  public:
    int getNumber();
    void setNumber(int);
};

归根结底,这真的很重要吗?我们可以遵循任何指导方针,或者在此方案中是否有任何内容?当我编程时,这个问题出现在我脑海中,但我从未见过有人讨论过关于实例本身的访问器/ mutator。

谢谢!

4 个答案:

答案 0 :(得分:3)

从实例中调用getter或setter的正确用例是当您需要利用getter或setter提供的副作用,验证或计算时。如果您不需要,为什么要在对象中复制此类功能?

纯粹主义者会将副作用,验证或计算重构为他们自己的私有方法,然后在内部和getter / setter中调用方法。这样,您就不会将公共接口与任何内部实现细节耦合。

答案 1 :(得分:1)

归结为一致性。恕我直言,一旦你创建了访问器方法,就没有企业直接访问实际变量 - 即使是在封闭类中也是如此。

通过使用您在类本身内公开公开的相同的setter和getter,无论何时访问您的成员变量,您都可以获得保证的通用行为。读取和修改只有一个点可以通过:无论是公开还是内部。

考虑一下,如果有一天你对名为myVar的特定成员整数进行零检查会怎么样?只有使用setNumber的代码才具有该功能。该类中直接使用该变量的所有行都必须单独修改。

答案 2 :(得分:0)

Getters / setter用于封装。使用getter / setter访问自己的成员的类是极端封装!答案是没有必要的,没有做到这一点的好处。

当它们中存在某些逻辑并且您想要始终应用它时,您可以使用getter / setter - 即使是私有成员访问。一个这样的例子是由getter合成的派生值。无论是另一个班级还是同一个班级 - 他们都必须通过吸气剂。

答案 3 :(得分:0)

我目前正在使用Mockito框架编写大量测试,用于制作模拟,当然,模拟对象的所有对象属性都设置为null。因此,如果我想在该对象上调用一些真正的方法如果该方法直接调用属性,我会得到NullPointerExceptions,或者某种意外行为,因为属性为null!

相反,如果我在我的类中使用getter,我可以模拟getX()方法返回应该设置的属性,我不必担心。

这是一个用例,我发现在类中使用getter是有用的。

我能想到的另一个原因是因为他们可能需要一些其他计算来获取或设置除了作业之外的东西。