代码改变世界

Effective Java 14 In public classes, use accessor methods, not public fields

2014-03-09 11:50  小郝(Kaibo Hao)  阅读(435)  评论(0编辑  收藏  举报

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 + "]";

}

}