setter和getter方法是否打破了封装?

时间:2016-01-15 06:10:22

标签: java oop

有人告诉我们应该避免制定者和吸毒者。关于它有各种各样的想法,但根据我使用这些打破封装。为什么?因为它告诉世界一个物体的内部。例如:

class Point {
  private int x;
  private int y;

  void setx(int x) {...}
  int getx() {...}
  ... 
}

对象应该只暴露为客户端提供清晰抽象的行为。

class Point {
  private int x;
  private int y;

  int coordinate(int x) {...} // 0, 1, 2, 3
  ... 
}

那么,这些存取器和setter方法是否会破坏封装?

2 个答案:

答案 0 :(得分:10)

来自here

  

拥有getter和setter本身并不会破坏封装。   破解封装有什么吸气剂和定位器   每个数据成员(每个字段,在java术语中)。那是一步之遥   从使所有数据成员公开。

     

封装的重点并不是你不应该知道的   或者从对象外部改变对象的状态,但是你   应该有合理的政策。

     

考虑一个Person类的例子。让我们说一个人有一个名字,   社会安全号码和年龄。让我们说我们不允许   人们要改变他们的名字或社会安全号码。然而,   这个人的年龄应该每年增加1。在这种情况下,   你会提供一个初始化名称和构造函数的构造函数   SSN到给定值,并将年龄初始化为0.你   还会提供一个方法incrementAge(),它会增加   年龄为1.您还可以为这三个人提供吸气剂。没有制定者   在这种情况下需要。

     

在此设计中,您可以检查对象的状态   在课外,你允许它从外面改变   类。但是,您不允许任意更改状态。   有一个策略,有效地说明了名称和SSN   根本无法改变,年龄可以增加1   一年一次。

     

现在让我们说一个人也有薪水。人们可以换工作   随意,这意味着他们的薪水也会发生变化。为此建模   情况我们没有其他办法,只能提供一个setSalary()方法!   允许随意改变工资是完全合理的   在这种情况下的政策。

     

顺便说一句,在你的例子中,我会给冰箱上课   putCheese()和takeCheese()方法,而不是get_cheese()和   set_cheese()。然后你仍然会有封装。

您还可以参考:Why getter and setter methods are evil

答案 1 :(得分:5)

虽然getter和setter实际上是为了实现Encapsulation本身,但它在很大程度上取决于情况本身。

  • Bad OO设计:公共领域。
  • 糟糕的OO设计:当使用getter和setter时,即使是在 不需要
  • 优秀的OO设计:仅在他们真正需要的地方使用 - 并且用于暴露类的行为而不是用于操纵数据的工具。