Book/Effective Java
Effective Java - item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
성공종
2023. 3. 22. 22:05
16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
클래스 내부의 field에 접근하기 위해 이 필드를 public으로 열어 직접 접근하게 하는것이 아닌 private으로 선언하고 이에 접근하는 메소드를 제공해야한다.
// 코드 16-2 접근자와 변경자(mutator) 메서드를 활용해 데이터를 캡슐화한다. (102쪽)
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; }
}
내부 필드를 직접 수정하게 하면 예기치 못할 문제가 발생할 수 있다
또한 getter나 setter를 두어 필드에 접근하게 하면 추후 이러한 메소드 내부 구현을 변경하는데 클라이언트 코드를 건드릴 필요가 없지만 내부 필드 접근을 허용하게 했다면 경직된 코드를 낳게 된다.
내부 필드가 immutable함이 보장된다면 public으로 열어도 될까?
// 코드 16-3 불변 필드를 노출한 public 클래스 - 과연 좋은가? (103-104쪽)
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;
}
// 나머지 코드 생략
}
final value로 선언된 hour과 minute은 예기치 못한 문제에는 대응할 수 있지만
method로 제공될 때 보다 유연함이 줄어든다. 여전히 필드에 접근하기 전 전처리 혹은 표현 방식의 변경이 경직되어 있다.
클래스의 접근 제한자가 package-private 혹은 private일 때는 field의 public 사용이 좋을 수도 있다고 한다.
GitHub - ssafystudy/EffectiveJava
Contribute to ssafystudy/EffectiveJava development by creating an account on GitHub.
github.com