Do not use public
fields
当您真正想要包装类的内部行为时,不要使用公共
字段。采取java.io.BufferedReader
。它有以下字段:
private boolean skipLF = false; // If the next character is a line feed, skip it
<code>skipLF</code>在所有读取方法中进行读取和写入。如果在单独线程中运行的外部类在读取过程中恶意修改了skipLF
的状态,该怎么办BufferedReader
肯定会失控。
Do use public
fields
以Point
类为例:
class Point {
private double x;
private double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return this.x;
}
public double getY() {
return this.y;
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
}
这将使计算两点之间的距离变得非常困难。
Point a = new Point(5.0, 4.0);
Point b = new Point(4.0, 9.0);
double distance = Math.sqrt(Math.pow(b.getX() - a.getX(), 2) + Math.pow(b.getY() - a.getY(), 2));
除了普通的getter和setter之外,该类没有任何其他行为。当类只表示一个数据结构,并且没有,<em>和</em>永远不会有行为时,使用公共字段是可以接受的(在这里,瘦getter和setter是<em>而不是<em>考虑的行为)。这样可以写得更好:
class Point {
public double x;
public double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
Point a = new Point(5.0, 4.0);
Point b = new Point(4.0, 9.0);
double distance = Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));
清洁的
但请记住:不仅你的课必须没有行为,而且它也应该有没有的理由在未来有行为。
(这正是这个答案描述。引用”Java编程语言的代码约定:10。编程实践“:
适当的公共实例变量的一个例子是,类本质上是一个没有行为的数据结构。换言之,如果使用结构
而不是类(如果Java支持struct
),那么将类的实例变量公开是合适的。
因此,官方文件也接受这种做法。)
此外,如果您特别确定上面Point
类的成员应该是不可变的,那么您可以添加final
关键字来强制执行它:
public final double x;
public final double y;