不要使用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和setters 不视为行为)。这样可以写得更好:
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.编程实践”:
适当的公共实例变量的一个例子是,该类实质上是一个数据结构,没有任何行为。换句话说,如果您使用a struct
而不是类(如果支持Java struct
),则应该公开该类的实例变量。
因此,官方文档也接受这种做法。)
另外,如果您进一步确定上述Point
类的成员应该是不可变的,则可以添加final
关键字来强制执行:
public final double x;
public final double y;