公共字段向对象的调用者公开对象的表示形式,即,如果必须更改表示形式,则调用者也必须进行更改。
通过封装表示,您可以强制调用者与之交互,并可以更改该表示,而无需修改调用者(只要公共api不变)。在任何不平凡的程序中,必须进行封装才能实现合理的可维护性。但是,当您需要胶囊时,它们的适当粒度可能大于单个类。例如,
Iterator从其内部表示形式封装a几乎没有意义
Collection。
顺便说一句,让我们看一下您的示例:
public class Point { public int x; public int y; public Point(int x, int y){ this.x = x; this.y = y; }}
该类的内部表示形式极不可能更改,因此通过将字段设为私有来隐藏表示形式的结构没有任何好处。但是,
Point一旦构造,我将阻止调用者对其进行修改:
public class Point { public final int x; public final int y; public Point(int x, int y){ this.x = x; this.y = y; }}
因此,实际上希望封装其状态的类可以在
Point不泄漏其内部表示的情况下返回其状态,并在其表示中使用给定的Point而不捕获它。这也与点的数学概念很好地吻合,该点没有身份或状态发生变化。
在设计程序时,玩游戏的特工需要访问董事会的状态(以便他们可以决定移动的方向)。他们还需要将此举动传递给游戏,以便可以将其确认为合法举动。在确定移动内容的过程中,将起点和终点归为威胁。
Board,Threat和Point对象实际上什么也没做。它们只是在那里存储可以以人类可读的方式访问的相关数据。
现在,这听起来像是在浪费封装的机会:确实不应允许代理商随意修改董事会,而只能采取法律行动。
Game当要更新的状态驻留在班级中时,为什么由班级负责决定什么是合法举动
Board?如果
Board要验证招数本身,则没有任何调用者,尤其是没有代理,可以违反游戏规则:
public class Board { // private fields with state // public methods to query state public void perform(Move move) throws IllegalMoveException;}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)