public abstract class AbstractTemplate<T> { // 추상 클래스를 상속 받은 클래스가 T == String이면 execute()의 반환값이 String이 된다.
private final LogTrace trace;
protected AbstractTemplate(LogTrace trace) {
this.trace = trace;
}
public T execute(String message){ // 구현체마다 execute()의 반환값이 다를 수가 있으니, 제네릭으로 정의를 하겠다.
TraceStatus status = null;
try{
status = trace.begin(message);
// 비지니스 로직 호출 ( 변하는 부분 )
T result = call();
trace.end(status);
return result;
}catch(Exception e){
throw new IllegalStateException();
}
}
// 자식 클래스에서 오버라이딩해야 함!! ( 변하는 부분 )
protected abstract T call();
}
public void orderItem(String itemId) // (TraceId traceId, String itemId) -> (String itemId) : holder 기법으로 동기화를 하므로, 더이상 매개변수
// 로 동기화를 해줄 필요가 없다.
{
AbstractTemplate<Void> template = new AbstractTemplate< >(trace) {
@Override
protected Void call() {
repository.save(itemId);
return null;
}
};
template.execute("OrderServiceV4.orderItem()");
}
'프로그래밍 언어 (プログラミング言語) > JAVA' 카테고리의 다른 글
Collectino Framework Hierarchy in JAVA(컬렉션 계층도) (0) | 2023.03.30 |
---|---|
JAVA에서의 Lamda ( = call back or call - after - function ) (0) | 2023.02.21 |
Anonymous class in JAVA (2) | 2023.02.20 |
Optional 클래스 사용법 (0) | 2023.02.15 |
Optional<T>의 탄생 배경 (0) | 2023.02.15 |