gpt4 book ai didi

java - Java 的公共(public)字段是怎么回事?

转载 作者:IT老高 更新时间:2023-10-28 20:38:22 29 4
gpt4 key购买 nike

我一直在阅读两篇文章 (1) (2)在 javaworld.com 上,关于所有类字段应该是私有(private)的,而 getter/setter 方法同样糟糕。对象应该对其拥有的数据进行操作,而不是允许对其进行访问。

我目前正在为 Connect Four 完成大学作业。 .在设计程序时,玩游戏的代理需要访问棋盘的状态(这样他们就可以决定要移动什么)。他们还需要将此举动传递给游戏,以便将其验证为合法举动。在决定要移动什么的过程中,碎片被分组为带有起点和终点的威胁。

Board、Threat 和 Point 对象实际上并没有做任何事情。它们只是用来存储可以以人类可读方式访问的相关数据。

在设计之初,我将板上的点表示为两个元素 int 数组,但是在创建点或引用它们的组件时这很烦人。

所以,类(class):

public class Point {
public int x;
public int y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}

在我能想到的每一个方面都很完美。除了它打破了我学到的每一条规则。我犯了罪吗?

最佳答案

公共(public)字段将对象的表示暴露给它的调用者,即如果表示必须改变,那么调用者也应该这样做。

通过封装表示,您可以强制调用者与其交互的方式,并且可以更改该表示,而无需修改调用者,前提是公共(public) api 未更改。在任何重要的程序中,封装对于实现合理的可维护性都是必要的。但是,虽然您需要胶囊,但它们的适当粒度可能大于单个类。例如,从它所操作的 Collection 的内部表示中封装一个 Iterator 是没有意义的。

不碍事,让我们看看你的例子:

public class Point {
public int x;
public int y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}

该类的内部表示极不可能更改,因此通过将字段设为私有(private)来隐藏表示的结构没有任何好处。但是,我会阻止调用者在构造 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 而无需 leaking其内部表示,并在其表示中使用给定的点而不使用 capturing它。这也非常适合点的数学概念,点没有身份或状态变化。

In designing the program the Agents playing the Game need access to the Board's state (so they can decide what to move). They also need to pass this move to the Game so it can validate it as a legal move. And during deciding what to move pieces are grouped into Threats with a start and end Points.

Board, Threat and Point objects don't really do anything. They are just there to store related data that can be accessed in a human readable way.

现在这听起来像是浪费了封装的机会:代理商确实不应该被允许任意修改董事会,而应仅限于合法行动。当被更新的状态驻留在类 Board 中时,为什么类 Game 有责任决定什么是合法移动?如果 Board 自己验证棋步,那么没有调用者,特别是没有代理,可以违反游戏规则:

public class Board {
// private fields with state

// public methods to query state

public void perform(Move move) throws IllegalMoveException;
}

关于java - Java 的公共(public)字段是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7959129/

29 4 0