【发布时间】:2011-12-19 00:52:46
【问题描述】:
我一直在阅读 javaworld.com 上的两篇文章 (1)(2),关于所有类字段应该如何私有以及 getter/setter 方法同样糟糕。一个对象应该作用于它拥有的数据,而不是允许访问它。
我目前正在为Connect Four 完成一项大学作业。在设计程序时,玩游戏的代理需要访问棋盘的状态(这样他们就可以决定要移动什么)。他们还需要将此举动传递给游戏,以便将其验证为合法举动。并且在决定要移动什么的过程中,碎片被分组为带有起点和终点的威胁。
Board、Threat 和 Point 对象实际上并没有做任何事情。它们只是用来存储可以以人类可读方式访问的相关数据。
在设计之初,我将板上的点表示为两个元素 int 数组,但是在创建点或引用它们的组件时这很烦人。
所以,班级:
public class Point {
public int x;
public int y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
在我能想到的每一个方面都很完美。除了它打破了我学到的每一条规则。我犯了罪吗?
【问题讨论】:
-
我假设一个 Point 不能被改变,对于一个新的 point 你创建一个新的对象,如果是这种情况,你应该声明
x和y,为final,这个将使您的代码不那么“违法”,因为 x/y 值不会有被用户操纵的“风险”[至少不是没有反射],类似于 java 数组的长度......跨度> -
是的,这是一个可怕的罪过,JDK 中 Point 类的原作者、在 Android 中编写 SensorEvent 类的谷歌人员以及其他许多人也犯了此罪。没有规则是绝对的,并且没有类似结构的 getter/setter(即基本上只是一个数据存储)并不是特别值得注意。
-
“我犯了罪吗?”不会。“我会被老师打分吗?”很可能是的。
-
@WW:如果是合适的老师,如果他解释了他选择使这些字段不可变和公开的原因,他仍然会得到分数。
-
我想补充一点,在我看来,将类字段设为私有是人们最糟糕的行为之一。如果您的课程与安全有关,那么请转至私人课程。否则不要,如果他不将那些无害的字段设为私有,我可以通过扩展课程来节省很多时间......