package org.argeo.util.register; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.Future; import java.util.function.Consumer; public class Singleton { private final Class clss; private final CompletableFuture registrationStage; private final List> unregistrationHooks = new ArrayList<>(); public Singleton(Class clss, CompletableFuture registrationStage) { this.clss = clss; this.registrationStage = registrationStage; } CompletionStage getRegistrationStage() { return registrationStage.minimalCompletionStage(); } public void addUnregistrationHook(Consumer todo) { unregistrationHooks.add(todo); } public Future getValue() { return registrationStage.copy(); } public CompletableFuture prepareUnregistration(Void v) { List> lst = new ArrayList<>(); for (Consumer hook : unregistrationHooks) { lst.add(registrationStage.thenAcceptAsync(hook)); } CompletableFuture prepareUnregistrationStage = CompletableFuture .allOf(lst.toArray(new CompletableFuture[lst.size()])); return prepareUnregistrationStage; } }