Principle
To offer the benefits of encapsulation you should always expose private field with public accessor method.
Correct Implementation
// Encapsulation of data by accessor methods and mutators
class Point {
private double x;
private double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() { return x; }
public double getY() { return y; }
public void setX(double x) { this.x = x; }
public void setY(double y) { this.y = y; }
}
Note
While it‘s never a good idea for a public class to expose fields directly, it is less harmful if the fields are immutable.
/**
* Public class with exposed immutable fields - questionable
*
* @author Kaibo
*
*/
public final class Time {
private static final int HOURS_PER_DAY = 24;
private static final int MINUTES_PER_HOUR = 60;
public final int hour;
public final int minute;
public Time(int hour, int minute) {
if (hour < 0 || hour >= HOURS_PER_DAY)
throw new IllegalArgumentException("Hour: " + hour);
if (minute < 0 || minute >= MINUTES_PER_HOUR)
throw new IllegalArgumentException("Min: " + minute);
this.hour = hour;
this.minute = minute;
}
public static void main(String[] args) {
Time t = new Time(1, 30);
t = new Time(2, 0);
System.out.println(t);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Time [hour=" + hour + ", minute=" + minute + "]";
}
}
Effective Java 14 In public classes, use accessor methods, not public fields,布布扣,bubuko.com
Effective Java 14 In public classes, use accessor methods, not public fields