From b93a202d60e82eadbcd9df3ad429d9c37e315fcb Mon Sep 17 00:00:00 2001 From: HY-love-sleep <73268470+HY-love-sleep@users.noreply.github.com> Date: Sun, 31 May 2026 23:17:23 +0800 Subject: [PATCH] feat: Refactor Callback pattern to support asynchronous callbacks (#3274) * refactor: Refactor Task execution to support asynchronous callbacks * fix: CallbackTest * chore: code style * feat: display synchronous and asynchronous callbacks --- .../main/java/com/iluwatar/callback/App.java | 7 ++- .../java/com/iluwatar/callback/Callback.java | 1 + .../main/java/com/iluwatar/callback/Task.java | 19 +++++++- .../com/iluwatar/callback/CallbackTest.java | 46 +++++++++++++++---- 4 files changed, 61 insertions(+), 12 deletions(-) diff --git a/callback/src/main/java/com/iluwatar/callback/App.java b/callback/src/main/java/com/iluwatar/callback/App.java index 7b630f8da..9afaa3fc3 100644 --- a/callback/src/main/java/com/iluwatar/callback/App.java +++ b/callback/src/main/java/com/iluwatar/callback/App.java @@ -39,6 +39,11 @@ public final class App { /** Program entry point. */ public static void main(final String[] args) { var task = new SimpleTask(); - task.executeWith(() -> LOGGER.info("I'm done now.")); + + LOGGER.info("=== Synchronous callback ==="); + task.executeWith(() -> LOGGER.info("Sync callback executed.")); + + LOGGER.info("=== Asynchronous callback ==="); + task.executeAsyncWith(() -> LOGGER.info("Async callback executed.")).join(); } } diff --git a/callback/src/main/java/com/iluwatar/callback/Callback.java b/callback/src/main/java/com/iluwatar/callback/Callback.java index 7b75b5c71..67b2880e1 100644 --- a/callback/src/main/java/com/iluwatar/callback/Callback.java +++ b/callback/src/main/java/com/iluwatar/callback/Callback.java @@ -25,6 +25,7 @@ package com.iluwatar.callback; /** Callback interface. */ +@FunctionalInterface public interface Callback { void call(); diff --git a/callback/src/main/java/com/iluwatar/callback/Task.java b/callback/src/main/java/com/iluwatar/callback/Task.java index d69697454..d58d55540 100644 --- a/callback/src/main/java/com/iluwatar/callback/Task.java +++ b/callback/src/main/java/com/iluwatar/callback/Task.java @@ -25,15 +25,30 @@ package com.iluwatar.callback; import java.util.Optional; +import java.util.concurrent.CompletableFuture; -/** Template-method class for callback hook execution. */ +/** + * Template-method class for callback hook execution. + * + *
Provides both synchronous and asynchronous execution with callback support.
+ */
public abstract class Task {
- /** Execute with callback. */
+ /** Execute the task and call the callback method synchronously upon completion. */
final void executeWith(Callback callback) {
execute();
Optional.ofNullable(callback).ifPresent(Callback::call);
}
+ /** Execute the task and asynchronously call the callback method upon completion. */
+ final CompletableFuture