2017-11-20 11 views
0

API 메소드가 ListenableFuture<T>을 반환하고 반환 값이 SettableFuture<T>으로 구현된다고합니다. SettableFuture로 캐스트 할 수없고 오동작하는 클라이언트가 완료 할 수없는 'ListenableFuture'를 반환 할 수있는 방법이 있습니까?읽기 전용 SettableFuture 참조

그래서 ListenableFuture의 읽기 전용보기입니다. .unmodifiableCollection으로 콜렉션을 래핑하는 것과 유사합니다.

답변

2

가장 쉬운 방법은 아마도 : 미래는 "쓰기는"사람들이 그것을 cancel 수 있다는 점에서 여전히

return Futures.transform(future, x -> x);

하는 것으로. 사용자가 원래의 미래를 취소하는 것을 막으려는 경우 - 나는이 문제에 관심이 있다고 생각하지 않지만 "읽기 전용"이라고 말한 이후에 어쨌든 가져오고 싶었습니다. 그런 다음 다음을 사용할 수 있습니다.

return Futures.nonCancellationPropagating(future);

+1

이제 네가 언급 했으니 까. 실패한 시험 쓰기. 이것을 지적 해 주셔서 감사합니다. – tariksbl

0

이것을 구현하는 데 널리 보급 된 디자인 패턴은 데코레이터 패턴입니다. Guava의 작성자가 이러한 유형의 요구 사항에 대해 앞으로 전달할 전화 번호를으로 어떻게 설계했는지 살펴볼 가치가 있습니다. 여기

는 예를 들어 추상 클래스 ForwardingListenableFuture에서 추출 된 일부 코드 :

/** 
* A {@link ListenableFuture} which forwards all its method calls to another 
* future. Subclasses should override one or more methods to modify the behavior 
* of the backing future as desired per the <a 
* href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>. 
* 
* <p>Most subclasses can just use {@link SimpleForwardingListenableFuture}. 
* 
* @param <V> The result type returned by this Future's {@code get} method 
* 
* @author Shardul Deo 
* @since 4.0 
*/ 
public abstract class ForwardingListenableFuture<V> extends ForwardingFuture<V> implements ListenableFuture<V> { 

    /** Constructor for use by subclasses. */ 
    protected ForwardingListenableFuture() {} 

    @Override 
    protected abstract ListenableFuture<V> delegate(); 

    @Override 
    public void addListener(Runnable listener, Executor exec) { 
    delegate().addListener(listener, exec); 
    } 
    ... 

은 당신이 할 수있는 것처럼,이 클래스의 책임이 ListenableFuture를 포장하고 클라이언트에 실제 구현을 숨기는 것입니다 - 모두 최종 사용자 구현자인 경우 delegate() 메서드는 구체적인 유형 대신 ListenableFuture을 반환합니다. 실제로 당신이 랩에 요구 사항을 숨기거나 할 구현ListenableFuture 객체를 생성

코드는 포장 미래에 set를 호출하는 클라이언트를 방지 할 수 ForwardingListenableFuture의 구현, 그것을 "장식". javadoc가 암시하고있는 것처럼, SimpleForwardingListenableFuture를 서브 클래스 화하면 (자), 위양 된 메소드에 잠재적 인 부작용이 도입되지 않고, 그 처리가 행해집니다.