Другим альтернативным решением было бы отказаться от пользовательского типа и смоделировать свойство как InputStream
public Thing {
// use field access level
private InputStream blob;
@Tranisent
private Future<That> that;
private static final ExecutorService executor = ExecutorService.newCachedThreadPool();
public Future<That> getThat(){
if( that == null ) {
// lazily submit the creation to the executor
that = executor.submit(new Callable<That>{/* implement call() */});
}
return that;
}
}
Думаю, что это может быть немного более доступным, чем тип пользователя Future<That>
Обратите внимание, когда вы получаете список Thing
, вам сначала нужно прокачать объекты перед тем, как пытаться получить доступ к значениям:
for( Thing thing: listOfThings ){
thing.getThat() ; // for side effects
}
for( Thing thing: listOfThings ){
That that = thing.getThat().get();
}
Есть несколько проблем с этим.
- Для Исполнителя нет четкого жизненного цикла. то есть как это будет отключение
- Нет гарантии, что первый элемент в списке будет первым, кто вернет результат, возможно, использование
ExecutorCompletationService
даст лучшее решение