이펙티브자바, 23 태그 달린 클래스보다는 클래스 계층구조를 활용하라

태그 주석으로 설명하지 말고 코드로 설명하라

  • 하나의 클래스에 여러 개의 내용이 있고 복잡한 경우 주석을 통해 복잡하게 설명하는 경우가 있다.
public class FigureV1 {
	enum Shape {RECTANGLE, CIRCLE}

	// 현재 모양
	final Shape shape;

	// 사각형에서 사용
	double length;
	double width;

	// 원에서 사용
	double radius;

	// 원에 사용
	FigureV1(double radius) {
		shape = Shape.CIRCLE;
		this.radius = radius;
	}

	// 사각형에 사용
	public FigureV1(double length, double width) {
		shape = Shape.RECTANGLE;
		this.length = length;
		this.width = width;
	}

	// 스위치로 분기
	double area() {
		switch(shape) {
			case RECTANGLE:
				return length*width;
			case CIRCLE:
				return Math.PI*(radius*radius);
			default:
				throw new AssertionError(shape);
		}
	}
}
  • 열거타입, swith, 주석 등 장황하고 복잡하다.
  • 이러한 방식을 클래스 계층구조를 통해 단순하고 쉽고 확장성 있게 구현 가능하다.

클래스 계층 구조로 구현

  • Figure를 추상클래스로 만들고, 공통 메서드 area를 하위 클래스에서 구현하도록 한다.
  • 각 구현체마다 필요로 한 기능과 매서드를 삽입할 수 있고, 이러한 구현은 어떤 설명도 필요 없이 코드만으로 이해할 수 있다.
  • Rectangle 에서 Square 로 확장 가능하다.
public abstract class Figure {
	abstract double area();
}

public class Circle extends Figure{
	private final double radius;

	Circle(double radius) {
		this.radius = radius;
	}

	@Override
	double area() {
		return Math.PI*(radius*radius);
	}

}

public class Rectangle extends Figure{
	private final double length;
	private final double width;

	public Rectangle(double length, double width) {
		this.length = length;
		this.width = width;
	}

	@Override
	double area() {
		return length*width;
	}
}
public class Square extends Rectangle{

	public Square(double side) {
		super(side, side);
	}

}