不要使用public
字段
public
当你真的想包装类的内部行为时,不要使用字段。举个java.io.BufferedReader
例子。它具有以下字段:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
在所有读取方法中读取和写入。如果在单独的线程中运行的外部类恶意修改skipLF
了读取过程中的状态怎么办?BufferedReader
肯定会失控。
使用public
字段
以这个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 之外,该类没有任何行为。当类只表示一个数据结构,并且没有,也永远不会有行为时,使用公共字段是可以接受的(这里不考虑细的 getter 和 setter 行为)。可以这样写更好:
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. 编程实践”:
适当的公共实例变量的一个例子是类本质上是一种数据结构,没有行为。换句话说,如果您使用 astruct
而不是类(如果 Java 支持struct
),那么将类的实例变量公开是合适的。
所以官方文档也接受这种做法。)
此外,如果您特别确定上述Point
类的成员应该是不可变的,那么您可以添加final
关键字来强制执行它:
public final double x;
public final double y;