본문 바로가기

프로그래밍 언어 (プログラミング言語)/JAVA

Void Wrapper Class

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()");

}