모던 자바 인 액션 2장 동작 파라미터화를 읽고 정리한 내용입니다.
동작 파라미터화란?
중복되는 코드를 방지하기 위해 동작, 즉 행위를 추상화한 것이라고 할 수 있다.
이해를 위해 아래 예시를 보자.
아래와 같이 색이 GREEN인 사과를 추출한다고 하자.
public List<Apple> filterGreenApples(List<Apple> inventory) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if (GREEN.equals(apple.getColor())) { //추출 조건
result.add(apple);
}
}
return result;
}
만약 다른 색으로 사과를 추출하고 싶다면 어떻게 해야할까?
⇒ 조건 내의 값을 파라미터화 하여 해당 값을 추상화 할 수 있다.
하지만, 색이 아닌 다른 조건으로 사과를 추출하고 싶다면 어떻게 해야할까?
요구 사항은 언제든 변할 수 있기 때문에, 위와 같은 필터 메서드를 조건마다 사용할 경우 중복이 발생한다.
그렇다면 요구 사항이 매번 변화할 때, 중복을 없애기 위해서 위의 메서드를 바라보면 추출 조건 부분 외에는 코드가 모두 같을 것이라는걸 알 수 있다.
그래서 아래와 같이 추출 조건에 해당하는 동작을 추상화 할 수 있다.
이를 동작 파라미터화
라고 한다.
public List<Apple> filterGreenApples(List<Apple> inventory, Predicate<Apple> p) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
**if (p.test(apple)) { //추출 조건**
result.add(apple);
}
}
return result;
}
동작 파라미터화 방법
public interface ApplePredicate { // Predicate custom
boolean test (Apple apple);
}
public class AppleGreenColorPredicate implements ApplePredicate {
public boolean test(Apple apple) {
return GREEN.equals(apple.getColor);
}
}
filterApples(inventory, new ApplePredicate() {
public boolean test(Apple apple) {
return RED.equals(apple.getColor());
}
});
filterApples(inventory, (Apple apple) -> RED.equals(apple.getColor()));