2016-06-28 2 views
2

호출 집합에 대한 요청 및 응답의 (비교적) 비 침습적 인 로깅을 수행하는 유틸리티를 작성하고 싶었고 java-8 람다/함수 인터페이스를 사용하여 끝내라.함수/공급자를 통한 lambda 인수에 대한 액세스

의 샘플 클라이언트 호출 코드가 있다고 가정 해 봅시다 :

SomeReturn retVal = someObject.doSomething(arg1, arg2); 

내가로 호출 할 수있는 레코더 유틸리티 작성 기대했다 :

SomeReturn retVal = Recorder.withRecording(() -> someObject.doSomething(arg1, arg2)) 

같은 모양 레코더 :

public static <R> R withRecording(Supplier<R> call) { 
    R response = call.get(); 
    // Record the response 
    return response; 
} 

그러나 요청 인수를 캡처하는 방법을 식별하지 못했습니다 (및 요청 st 개체) Supplier에서 (그리고 올바르게 - Supplier는 그것에 관련되지 않습니다.) 심지어 그들은 java.util.function.Function도 여기에 도움이되지 않을 것이라고 생각합니다. 왜냐하면 그들은 스스로 상태를 다루지 않기 때문입니다. 우리가 않는 다른 어떤 옵션을

Object withRecording(Object target, Method method, Object[] arguments) 

같은 것들을 의지하지 않고

? 나는 해결책으로 AOP를 사용할 수 있지만, 우리가 AOP를없이 할 수 있는지 알고 싶다.

미리 감사드립니다.

+2

가능하더라도 (나는 간단하게 생각하지 않습니다), 당신은 수천 Recorder.withRecording'의 그 녹음을 해제/제거하고 싶은 날에는 모자를 먹을 것입니다. 당신이 말했듯이, 이것은 AOP를위한 완벽한 시나리오처럼 들립니다. – Tunaki

답변

4

이것은 알려진 기능적 서명 세트로 작동하는 경우에만 작동합니다.

public static <T,U,R> R withRecording(BiFunction<T,U,R> func, T arg1, U arg2) { 
    R response = func.apply(arg1, arg2); 
    // Record arg1, arg2 and the response 
    return response; 
} 

사용할 수

SomeReturn retVal = withRecording(someObject::doSomething, arg1, arg2); 

으로 이것은 단지 당신이 지원되는 모든 서명을 한 과부하, 인수, 즉 별개의 수를 만들 필요가 있다는 것을 의미하지는 않습니다, 당신은 또한 각 기능에 대한 적절한 인터페이스를 만들어야합니다 이 경우에는 미리 정의 된 인터페이스가 없기 때문에 두 개 이상의 인수가 필요합니다. 또한

, 그래서 녹음 할 모든이 ...

일부 기능이 특정 인수 및 결과,하지만 기능이 불려 간 즉, 함수 객체 자체가 실제 기능에 대해 아무것도 공개하지 않습니다

더 나은 솔루션은 모든 호출을 기록 someObject 명 규모의 또 다른 구현에 대한 참조로 someObject을 대체 할 수 있도록하는 인터페이스 방법으로 선언 doSomething을하는 것입니다. 이 기능은 프록시를 사용하는 일반적인 방법으로 구현 될 수 있지만 잘, 은 AOP 솔루션과 겹치는입니다 ...

+0

프록시에 대한 참조 및 AOP와의 겹침에 대한 대답으로이를 수락합니다. – Kilokahn

관련 문제