Intro::
이펙티브 자바 정리본입니다.
결론
- public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라.
접근자 메서드 예시
// 캡슐화의 이점을 제공하지 못한다. class Point { public double x; public double y; }
// 코드 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; } }
- 패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 제공함으로써 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 얻을 수 있습니다.
- 하지만 package-private 클래스 혹은 private 중첩 클래스라면 데이터 필드를 노출한다 해도 하등의 문제가 없습니다.
궁금즘
java.awt.package 패키지의 Point와 Dimension 클래스가 심각한 성능 문제를 야기한다고 하는데 정확히 무슨 성능 문제를…??
java.awt.Component 클래스의 getsize 메서드의 경우, Dimension인스턴스를 반환할도록 되어있다. 이때 Dimension은 가변으로 설계했으니 getsize를 호출하는 모든 곳에서 Dimension 인스턴스를 방어적으로 복사하느라 새로 생성해야한다.
// 가변 객체의 방어적 복사 public class Dimension extends Dimension2D implements java.io.Serializable { public int width; public int height; ... public Dimension getSize() { return new Dimension(width, height); } }
// 불변 객체라면...?? public final class ImmutableDimension { private final int width; private final int height; public ImmutableDimension(int width, int height) { this.width = width; this.height = height; } public int getWidth() { return width; } public int getHeight() { return height; } public ImmutableDimension getSize() { return this; // 자기 자신을 반환 } }
References::
이펙티브 자바 / 조슈아 블로크 지음 (프로그래밍 인사이트)
Loading Comments...