What is a callback method in Java? (Term seems to be used loosely)

By using the callback mechanism we will get our own method implementation calling back only. or a particular implementation when the event has been clicked. It will be used mostly in EventHandlers in java.


package com.callbackExample;

public abstract interface SomeEventHandler {
    public abstract void hadleClick();//by default abstract

}

package com.callbackExample;

public class SomeEventImplementation implements SomeEventHandler {

    @Override
    public void hadleClick() {
        System.out.println("Click Handler : clicked");
    }

}

package com.callbackExample;

public class Button {
    public void onClick(SomeEventHandler clickEventHandler) {
        clickEventHandler.hadleClick();
    }

}
package com.callbackExample;

public class Test {
    public static void main(String[] args) {
        Button button=new Button();
        SomeEventImplementation someEventImplementation=new SomeEventImplementation();
        button.onClick(someEventImplementation);
        
        Button button2=new Button();
        button2.onClick(new SomeEventHandler() {
            
            @Override
            public void hadleClick() {
                System.out.println("button2 : my own implementation..");
            }
        });
    }

}

-------------------------------------------
OUTPUT  : Click Handler : clicked
          button2 : my own implementation..
-------------------------------------------

A callback is a piece of code that you pass as an argument to some other code so that it executes it. Since Java doesn't yet support function pointers, they are implemented as Command objects. Something like

public class Test {
    public static void main(String[] args) throws  Exception {
        new Test().doWork(new Callback() { // implementing class            
            @Override
            public void call() {
                System.out.println("callback called");
            }
        });
    }

    public void doWork(Callback callback) {
        System.out.println("doing work");
        callback.call();
    }

    public interface Callback {
        void call();
    }
}

A callback will usually hold reference to some state to actually be useful.

By making the callback implementation have all the dependencies to your code, you gain indirection between your code and the code that is executing the callback.


A callback method in java is a method that gets called when an event (call it E) occurs. Usually you can implement that by passing an implementation of a certain interface to the system that is responsible for triggering the event E (see example 1).

Also in bigger and more complex systems you simply can annotate a method and the system will identify all annotated methods and will call them when the event occurs (see example 2). Of course the system defines what parameters the method should receive and other constraints.

Example 1:

public interface Callback {
    //parameters can be of any types, depending on the event defined
    void callbackMethod(String aParameter);
}


public class CallbackImpl implements Callback {
    void callbackMethod(String aParameter) {
     //here you do your logic with the received paratemers
     //System.out.println("Parameter received: " + aParameter);

    }
}

//.... and then somewhere you have to tell the system to add the callback method
//e.g. systemInstance.addCallback(new CallbackImpl());

Example 2:

//by annotating a method with this annotation, the system will know which method it should call. 
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CallbackAnnotation {}


public class AClass {

    @CallbackAnnotation
    void callbackMethod(String aParameter) {
     //here you do your logic with the received paratemers
     //System.out.println("Parameter received: " + aParameter);

    }
}

//.... and then somewhere you have to tell the system to add the callback class
//and the system will create an instance of the callback class
//e.g. systemInstance.addCallbackClass(AClass.class);