有人告诉我们应该避免制定者和吸毒者。关于它有各种各样的想法,但根据我使用这些打破封装。为什么?因为它告诉世界一个物体的内部。例如:
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方法是否会破坏封装?
答案 0 :(得分:10)
来自here:
拥有getter和setter本身并不会破坏封装。 破解封装有什么吸气剂和定位器 每个数据成员(每个字段,在java术语中)。那是一步之遥 从使所有数据成员公开。
封装的重点并不是你不应该知道的 或者从对象外部改变对象的状态,但是你 应该有合理的政策。
考虑一个Person类的例子。让我们说一个人有一个名字, 社会安全号码和年龄。让我们说我们不允许 人们要改变他们的名字或社会安全号码。然而, 这个人的年龄应该每年增加1。在这种情况下, 你会提供一个初始化名称和构造函数的构造函数 SSN到给定值,并将年龄初始化为0.你 还会提供一个方法incrementAge(),它会增加 年龄为1.您还可以为这三个人提供吸气剂。没有制定者 在这种情况下需要。
在此设计中,您可以检查对象的状态 在课外,你允许它从外面改变 类。但是,您不允许任意更改状态。 有一个策略,有效地说明了名称和SSN 根本无法改变,年龄可以增加1 一年一次。
现在让我们说一个人也有薪水。人们可以换工作 随意,这意味着他们的薪水也会发生变化。为此建模 情况我们没有其他办法,只能提供一个setSalary()方法! 允许随意改变工资是完全合理的 在这种情况下的政策。
顺便说一句,在你的例子中,我会给冰箱上课 putCheese()和takeCheese()方法,而不是get_cheese()和 set_cheese()。然后你仍然会有封装。
答案 1 :(得分:5)
虽然getter和setter实际上是为了实现Encapsulation本身,但它在很大程度上取决于情况本身。