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

6

62

I don't understand what a callback method is and I have heard people use that term very loosely. In the Java world, what is a callback method? If someone could provide some example code of a Java callback method with an explanation, it would be a great help in my Java learning journey.

Wildawildcat answered 16/10, 2013 at 13:57 Comment(0)
L
66

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.

Lurcher answered 16/10, 2013 at 14:0 Comment(6)
This is a fine example, I would like to add the following: a callback method can be any method in any class; a reference to an instance of the class is maintained in some other class, and, when some event happens in that other class, it calls the method from the first class. The only thing that makes it a callback as distinguished from any other method call is the idea of handing a reference to an object for the purpose of having that object invoke a method on it later, usually on some event.Ainu
Sorry I am new to java. Could this be done without an anonymous class? Does it have to be Callback interface? Can you provide a different example that doesn't use Callback interface if there is a way to do it without using this Callback interface?Wildawildcat
@ImtiazAhmad No, the anonymous class is to make the example shorter. You could create a public class MyCallbackImpl implements Callback.Lurcher
@ImtiazAhmad Without the callback, the code inside the anonymous class would need to be called directly in the doWork() method.Lurcher
How would it be called directly in doWork() method?Wildawildcat
@ImtiazAhmad The developer would have to copy/paste the code if that was possible for them.Lurcher
M
13

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);
Melliemelliferous answered 16/10, 2013 at 14:1 Comment(0)
J
3

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..
-------------------------------------------
Jacobsohn answered 27/1, 2021 at 5:56 Comment(1)
for better uderstading about the callback mechanism, see ASYNCHRONOUS communication in JavaScript or NodeJs. CallBack mechanism best suitable for some of IO bound operations reference : youtube.com/watch?v=8aGhZQkoFbQ , once we call the callback function, we should give promise to the caller saying that , will be received either fail or success from my callback funtion.Jacobsohn
R
2

In simple terms, callback mechanism refers to calling a function with another function as an argument. In languages like C,C++ this is done by passing function pointers as arguments but java doesn't have the concept of pointers. The workaround is interfaces. We pass reference to interfaces instead of pointers. Your understanding will be crystal clear after understanding the code below. To also show the real world applications, imagine purchasing a mouse and a mouse pad. The mouse pad price is fixed but mouse price differs by brand.

interface mouse
{
    double mousePrice();
}
class BrandA implements mouse
{
    public double mousePrice()          //note that public access modifier is needed as all methods of interface are public are by default and when you override them
    //you cannot use any access modifier more restrictive
    {
        return 100;
    }

}

class BrandB implements mouse
{
    public double mousePrice()
    {
        return 200;
    }

}

class Simple
{
    static void total(mouse t)
    {
        double mousepad = 20;
        double mousep = t.mousePrice();
        System.out.println(mousepad + mousep);
    }
    public static void main(String args[])
    {
        mouse ob = new BrandA();        //upcasting. 
        total(ob);
    }
}
Robespierre answered 21/11, 2018 at 13:4 Comment(0)
T
0

@Sotirios Delimanolis answer is good but I wanted to give clear example which explains callbacks in a way how listeners works - following approach is greatly adopted by android library.

class RemoteClass {

    private OnChangeListener mOnChangeListener;

    void makeSomeChanges() {
        /*
        .. do something here and call callback
        */
        mOnChangeListener.onChanged(this, 1);
    }

    public void setOnChangeListener(OnChangeListener listener) {
        mOnChangeListener = listener;
    }

    public interface OnChangeListener {
        public void onChanged(RemoteClass remoteClass, int test);
    }
}

There is a class built my someone, which goes by name RemoteClass and tells your class to reference the callback by passing implementation of OnChangeListener interface to setOnChangeListener method.

class Test {

    public static void main(String[] args) {    
        RemoteClass obj = new RemoteClass();
        obj.setOnChangeListener(demoChanged);
        obj.makeSomeChanges();
    }

    private static RemoteClass.OnChangeListener demoChanged = new RemoteClass.OnChangeListener() {
        @Override
        public void onChanged(RemoteClass remoteClass, int incoming) {
            switch (incoming) {
                case 1:
                    System.out.println("I will take appropriate action!");
                    break;
                default:
                    break;
            }
        }
    };
}

Now your class has finished doing its task and RemoteClass does its work and upon calling makeSomeChanges whenever necessary results in onChanged method execution using mOnChangeListener reference.

Tighe answered 7/1, 2020 at 17:11 Comment(0)
M
0

Calling the onSuccess or onFailure callback methods, based on the status doing work.

package mains.geeks;

public class Test {
    public static void main(String[] args) throws  Exception {

        Test testObj = new Test();

        testObj.doWork(new Callback() {
            @Override
            public void onSucess() {
                System.out.println("success callback called");
            }
            @Override
            public void onFailure() {
                System.out.println("onFailure callback called");
            }
        });
    }

    public void doWork(Callback callback) {
        System.out.println("doing work");
        if (false){
            callback.onSucess();
        } else {
            callback.onFailure();
        }
    }

    public interface Callback {
        void onSucess();
        void onFailure();
    }
}
Militia answered 14/2, 2023 at 21:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.