जावा में कॉलबैक फ़ंक्शन


177

क्या जावा विधि में कॉल बैक फ़ंक्शन पास करने का कोई तरीका है?

मैं जिस व्यवहार की नकल करने की कोशिश कर रहा हूं, वह एक .net डेलीगेट एक समारोह में पारित किया जा रहा है।

मैंने देखा है कि लोग एक अलग ऑब्जेक्ट बनाने का सुझाव दे रहे हैं, लेकिन यह ओवरकिल लगता है, हालांकि मुझे पता है कि कभी-कभी ओवरकिल काम करने का एकमात्र तरीका है।


51
यह ओवरकिल है क्योंकि जावा नॉनफंक्शनल है (यह एक वाक्य माना जाता है ...)।
कीथ पिंसन

एक और जावा 8 उदाहरण: stackoverflow.com/questions/14319787/…
वडज़िम

जवाबों:


155

यदि आपका मतलब .NET अनाम प्रतिनिधि की तरह है, तो मुझे लगता है कि जावा के अनाम वर्ग का भी उपयोग किया जा सकता है।

public class Main {

    public interface Visitor{
        int doJob(int a, int b);
    }


    public static void main(String[] args) {
        Visitor adder = new Visitor(){
            public int doJob(int a, int b) {
                return a + b;
            }
        };

        Visitor multiplier = new Visitor(){
            public int doJob(int a, int b) {
                return a*b;
            }
        };

        System.out.println(adder.doJob(10, 20));
        System.out.println(multiplier.doJob(10, 20));

    }
}

3
यह जावा 1.0 के बाद से विहित विधि है।
चार्ली मार्टिन

1
मैं यह प्रयोग कर रहा हूं, यह मेरे द्वारा की गई तुलना में अधिक क्रियात्मक है, लेकिन यह काम करता है।
उमर कूहेजी

23
@ उमर, मान गई। मैं C # के साथ एक लंबे कार्यकाल के बाद जावा में वापस आया हूं और वास्तव में लंबोदर / प्रतिनिधियों को याद करता हूं। जावा पर आओ!
ड्रू नोक

4
@DrewNoakes, खुशखबरी है, Java 8 में लैम्ब्डा (ज्यादातर) है ...
लुकास

2
चूँकि आपने इंटरफ़ेस विज़िटर को एकल विधि से परिभाषित किया है, इसलिए आप इसके बजाय मैच करने वाले लैम्ब्डा को पास कर सकते हैं।
जॉय बारूच

43

जावा 8 के बाद से, लंबोदर और विधि संदर्भ हैं:

उदाहरण के लिए, यदि आप एक कार्यात्मक इंटरफ़ेस चाहते हैं A -> Bजैसे:

import java.util.function.Function;

public MyClass {
    public static String applyFunction(String name, Function<String,String> function){
        return function.apply(name);
    }
}

तो आप इसे ऐसा कह सकते हैं

MyClass.applyFunction("42", str -> "the answer is: " + str);
// returns "the answer is: 42"

इसके अलावा आप कक्षा विधि पास कर सकते हैं। आप कहें:

@Value // lombok
public class PrefixAppender {
    private String prefix;

    public String addPrefix(String suffix){
        return prefix +":"+suffix;
    }
}

तो आप कर सकते हैं:

PrefixAppender prefixAppender= new PrefixAppender("prefix");
MyClass.applyFunction("some text", prefixAppender::addPrefix);
// returns "prefix:some text"

नोट :

यहां मैंने कार्यात्मक इंटरफ़ेस का उपयोग किया Function<A,B>, लेकिन पैकेज में कई अन्य हैं java.util.function। सबसे उल्लेखनीय हैं

  • Supplier: void -> A
  • Consumer: A -> void
  • BiConsumer: (A,B) -> void
  • Function: A -> B
  • BiFunction: (A,B) -> C

और कई अन्य जो कुछ इनपुट / आउटपुट प्रकार के विशेषज्ञ हैं। फिर, यदि यह आपकी ज़रूरत के हिसाब से उपलब्ध नहीं कराता है, तो आप अपना स्वयं का कार्यात्मक इंटरफ़ेस बना सकते हैं:

@FunctionalInterface
interface Function3<In1, In2, In3, Out> { // (In1,In2,In3) -> Out
    public Out apply(In1 in1, In2 in2, In3 in3);
}

उपयोग का उदाहरण:

String computeAnswer(Function3<String, Integer, Integer, String> f){
    return f.apply("6x9=", 6, 9);
}

computeAnswer((question, a, b) -> question + "42");
// "6*9=42"

1
CallBacks के लिए, अपने स्वयं के कार्यात्मक इंटरफ़ेस को लिखना बेहतर होगा क्योंकि प्रत्येक कॉलबैक प्रकार में आमतौर पर कई वाक्यविन्यास होंगे।
श्री हर्ष चिलकापति

मुझे समझ में नहीं आ रहा है। यदि आप जिन कक्षाओं में से java.util.functionएक देख रहे हैं, उनमें से एक है , तो आप जाने के लिए अच्छे हैं। फिर आप I / O के लिए जेनरिक के साथ खेल सकते हैं। (?)
Juh_

आपने मुझे प्राप्त नहीं किया, मैंने जो कहा वह C ++ कोड के अनुवाद के बारे में है जो जावा 8 में कॉलबैक फ़ंक्शन का उपयोग करता है, प्रत्येक अद्वितीय फ़ंक्शन पॉइंटर के लिए, आपको जावा में एक कार्यात्मक इंटरफ़ेस बनाना होगा, क्योंकि वास्तविक में अधिक पैरामीटर होंगे। उत्पादन कोड।
श्री हर्ष चिलकापति १५'१४

2
मेरा निष्कर्ष यह है कि अधिकांश समय, आपको अपने स्वयं के कार्यात्मक इंटरफेस लिखने की आवश्यकता होती है क्योंकि डिफ़ॉल्ट प्रदान किए गए हैं, java.util.functionपर्याप्त नहीं हैं।
श्री हर्ष चिलकापति

1
मैंने मौजूदा कार्यात्मक इंटरफेस पर एक नोट जोड़ा और नए लोगों को कैसे बनाया
जुह_

28

सादगी के लिए, आप एक Runnable का उपयोग कर सकते हैं :

private void runCallback(Runnable callback)
{
    // Run callback
    callback.run();
}

उपयोग:

runCallback(new Runnable()
{
    @Override
    public void run()
    {
        // Running callback
    }
});

2
मुझे यह पसंद है क्योंकि मुझे एक साधारण कॉलबैक करने के लिए एक नया इंटरफ़ेस या क्लास बनाने की आवश्यकता नहीं है। पारितोषिक के लिए धन्यवाद!
ब्रूस

1
public interface SimpleCallback { void callback(Object... objects); }यह काफी सरल है और उपयोगी हो सकता है कि आपको कुछ पारमों को भी पास करने की आवश्यकता हो।
मार्को सी।

@cprcrack रन () फ़ंक्शन में मान पास करने का कोई तरीका नहीं है?
क्रिस शेवेलियर

16

थोड़ा सा नाइटपैकिंग:

मुझे लगता है कि लोग एक अलग वस्तु बनाने का सुझाव दे रहे हैं, लेकिन लगता है कि ओवरकिल है

कॉलबैक पास करने में किसी भी ओओ भाषा में एक अलग ऑब्जेक्ट बनाना शामिल है, इसलिए इसे शायद ही कभी ओवरकिल माना जा सकता है। आपके लिए शायद इसका मतलब यह है कि जावा में, आपको एक अलग वर्ग बनाने की आवश्यकता है, जो स्पष्ट प्रथम श्रेणी के कार्यों या क्लोजर वाली भाषाओं की तुलना में अधिक क्रियात्मक (और अधिक संसाधन-गहन) है। हालांकि, अनाम कक्षाएं कम से कम क्रियाशीलता को कम करती हैं और इनलाइन का उपयोग किया जा सकता है।


12
हां, मेरा यही मतलब है। 30 या तो घटनाओं के साथ आप 30 वर्गों के साथ समाप्त होते हैं।
उमर कूहेजी

16

अभी तक मुझे लगता है कि सबसे पसंदीदा तरीका है जो मैं देख रहा था .. यह मूल रूप से इन उत्तरों से लिया गया है, लेकिन मुझे इसे अधिक अनावश्यक और कुशल में हेरफेर करना पड़ा .. और मुझे लगता है कि मैं जो भी लेकर आ रहा हूं, हर कोई इसे देख रहा है

मुद्दे पर::

पहले एक इंटरफ़ेस बनाएं जो सरल हो

public interface myCallback {
    void onSuccess();
    void onError(String err);
}

अब इस कॉलबैक को चलाने के लिए जब आप कभी भी परिणामों को संभालने के लिए करना चाहते हैं - तो async कॉल के बाद अधिक संभावना है और आप कुछ सामान चलाना चाहते हैं जो इन पुन: लिंक पर निर्भर करता है

// import the Interface class here

public class App {

    public static void main(String[] args) {
        // call your method
        doSomething("list your Params", new myCallback(){
            @Override
            public void onSuccess() {
                // no errors
                System.out.println("Done");
            }

            @Override
            public void onError(String err) {
                // error happen
                System.out.println(err);
            }
        });
    }

    private void doSomething(String param, // some params..
                             myCallback callback) {
        // now call onSuccess whenever you want if results are ready
        if(results_success)
            callback.onSuccess();
        else
            callback.onError(someError);
    }

}

doSomething फ़ंक्शन है जो कुछ समय लेता है आप इसे कॉलबैक जोड़ना चाहते हैं ताकि परिणाम आने पर आपको सूचित किया जा सके, इस पद्धति के पैरामीटर के रूप में कॉल बैक इंटरफ़ेस जोड़ें

आशा है कि मेरी बात स्पष्ट है, आनंद लें;)


11

यह लैम्ब्डा के साथ जावा 8 में बहुत आसान है।

public interface Callback {
    void callback();
}

public class Main {
    public static void main(String[] args) {
        methodThatExpectsACallback(() -> System.out.println("I am the callback."));
    }
    private static void methodThatExpectsACallback(Callback callback){
        System.out.println("I am the method.");
        callback.callback();
    }
}

क्या यह तर्क के मामले में ऐसा होगा? pastebin.com/KFFtXPNA
नशिव

1
हां। जब तक उचित लंबोदर सिंटैक्स बनाए रखा जाता है, तब तक कोई भी तर्क (या कोई भी) काम नहीं करेगा।
gk bwg rhb mbreafteahbtehnb

7

मुझे परिलक्षित पुस्तकालय का उपयोग करके इसे लागू करने का विचार दिलचस्प लगा और इसके साथ आया जो मुझे लगता है कि काफी अच्छी तरह से काम करता है। केवल नीचे की ओर संकलित समय की जांच खो रही है कि आप वैध पैरामीटर पारित कर रहे हैं।

public class CallBack {
    private String methodName;
    private Object scope;

    public CallBack(Object scope, String methodName) {
        this.methodName = methodName;
        this.scope = scope;
    }

    public Object invoke(Object... parameters) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
        Method method = scope.getClass().getMethod(methodName, getParameterClasses(parameters));
        return method.invoke(scope, parameters);
    }

    private Class[] getParameterClasses(Object... parameters) {
        Class[] classes = new Class[parameters.length];
        for (int i=0; i < classes.length; i++) {
            classes[i] = parameters[i].getClass();
        }
        return classes;
    }
}

आप इसे इस तरह से उपयोग करें

public class CallBackTest {
    @Test
    public void testCallBack() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        TestClass testClass = new TestClass();
        CallBack callBack = new CallBack(testClass, "hello");
        callBack.invoke();
        callBack.invoke("Fred");
    }

    public class TestClass {
        public void hello() {
            System.out.println("Hello World");
        }

        public void hello(String name) {
            System.out.println("Hello " + name);
        }
    }
}

ओवरकिल जैसा कुछ दिखता है (/ me ducks)
Diederik

उपयोग की संख्या और परियोजना के आकार पर निर्भर करता है: कुछ वर्ग की परियोजना के लिए ओवरकिल, एक बड़े पर व्यावहारिक।
जुह_

इसके अलावा, @monnoo के जवाब पर एक नज़र डालें
Juh_

5

एक विधि जावा में एक प्रथम श्रेणी की वस्तु (अभी तक) नहीं है; आप कॉलबैक के रूप में फ़ंक्शन पॉइंटर पास नहीं कर सकते। इसके बजाय, एक ऑब्जेक्ट बनाएं (जो आमतौर पर एक इंटरफ़ेस को लागू करता है) जिसमें वह विधि शामिल है जिसकी आपको ज़रूरत है और जो पास है।

जावा में बंद करने के प्रस्ताव - जो व्यवहार आप के लिए देख रहे हैं प्रदान करेगा - बना दिया गया है, लेकिन आगामी जावा 7 रिलीज में कोई भी शामिल नहीं किया जाएगा।


1
"एक विधि नहीं है (अभी तक) जावा में एक प्रथम श्रेणी की वस्तु" - ठीक है, वहाँ विधि वर्ग [1] है, जिसमें से आप निश्चित रूप से उदाहरणों के आसपास से गुजर सकते हैं। यह स्वच्छ, मुहावरेदार, OO कोड नहीं है जो आप जावा से उम्मीद करेंगे, लेकिन यह समीचीन हो सकता है। हालांकि, निश्चित रूप से कुछ पर विचार करने के लिए। [१] java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html
जोनास

4

जब मुझे जावा में इस तरह की कार्यक्षमता की आवश्यकता होती है, तो मैं आमतौर पर ऑब्जर्वर पैटर्न का उपयोग करता हूं । यह एक अतिरिक्त वस्तु का अर्थ करता है, लेकिन मुझे लगता है कि यह एक साफ रास्ता है, और यह एक व्यापक रूप से समझा जाने वाला पैटर्न है, जो कोड पठनीयता के साथ मदद करता है।



3

मैंने 'कॉलबैक' को लागू करने के लिए java.lang.reflect का उपयोग करने की कोशिश की, यहाँ एक नमूना है:

package StackOverflowQ443708_JavaCallBackTest;

import java.lang.reflect.*;
import java.util.concurrent.*;

class MyTimer
{
    ExecutorService EXE =
        //Executors.newCachedThreadPool ();
        Executors.newSingleThreadExecutor ();

    public static void PrintLine ()
    {
        System.out.println ("--------------------------------------------------------------------------------");
    }

    public void SetTimer (final int timeout, final Object obj, final String methodName, final Object... args)
    {
        SetTimer (timeout, obj, false, methodName, args);
    }
    public void SetTimer (final int timeout, final Object obj, final boolean isStatic, final String methodName, final Object... args)
    {
        Class<?>[] argTypes = null;
        if (args != null)
        {
            argTypes = new Class<?> [args.length];
            for (int i=0; i<args.length; i++)
            {
                argTypes[i] = args[i].getClass ();
            }
        }

        SetTimer (timeout, obj, isStatic, methodName, argTypes, args);
    }
    public void SetTimer (final int timeout, final Object obj, final String methodName, final Class<?>[] argTypes, final Object... args)
    {
        SetTimer (timeout, obj, false, methodName, argTypes, args);
    }
    public void SetTimer (final int timeout, final Object obj, final boolean isStatic, final String methodName, final Class<?>[] argTypes, final Object... args)
    {
        EXE.execute (
            new Runnable()
            {
                public void run ()
                {
                    Class<?> c;
                    Method method;
                    try
                    {
                        if (isStatic) c = (Class<?>)obj;
                        else c = obj.getClass ();

                        System.out.println ("Wait for " + timeout + " seconds to invoke " + c.getSimpleName () + "::[" + methodName + "]");
                        TimeUnit.SECONDS.sleep (timeout);
                        System.out.println ();
                        System.out.println ("invoking " + c.getSimpleName () + "::[" + methodName + "]...");
                        PrintLine ();
                        method = c.getDeclaredMethod (methodName, argTypes);
                        method.invoke (obj, args);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                    finally
                    {
                        PrintLine ();
                    }
                }
            }
        );
    }
    public void ShutdownTimer ()
    {
        EXE.shutdown ();
    }
}

public class CallBackTest
{
    public void onUserTimeout ()
    {
        System.out.println ("onUserTimeout");
    }
    public void onTestEnd ()
    {
        System.out.println ("onTestEnd");
    }
    public void NullParameterTest (String sParam, int iParam)
    {
        System.out.println ("NullParameterTest: String parameter=" + sParam + ", int parameter=" + iParam);
    }
    public static void main (String[] args)
    {
        CallBackTest test = new CallBackTest ();
        MyTimer timer = new MyTimer ();

        timer.SetTimer ((int)(Math.random ()*10), test, "onUserTimeout");
        timer.SetTimer ((int)(Math.random ()*10), test, "onTestEnd");
        timer.SetTimer ((int)(Math.random ()*10), test, "A-Method-Which-Is-Not-Exists");    // java.lang.NoSuchMethodException

        timer.SetTimer ((int)(Math.random ()*10), System.out, "println", "this is an argument of System.out.println() which is called by timer");
        timer.SetTimer ((int)(Math.random ()*10), System.class, true, "currentTimeMillis");
        timer.SetTimer ((int)(Math.random ()*10), System.class, true, "currentTimeMillis", "Should-Not-Pass-Arguments");    // java.lang.NoSuchMethodException

        timer.SetTimer ((int)(Math.random ()*10), String.class, true, "format", "%d %X", 100, 200); // java.lang.NoSuchMethodException
        timer.SetTimer ((int)(Math.random ()*10), String.class, true, "format", "%d %X", new Object[]{100, 200});

        timer.SetTimer ((int)(Math.random ()*10), test, "NullParameterTest", new Class<?>[]{String.class, int.class}, null, 888);

        timer.ShutdownTimer ();
    }
}

आप एक arg के रूप में null कैसे पास करते हैं?
TWStStrrob

@TWiStErRob, इस नमूने में, यह ऐसा होगा timer.SetTimer ((int)(Math.random ()*10), System.out, "printf", "%s: [%s]", new Object[]{"null test", null});। आउटपुट होगाnull test: [null]
लियूयान be be

क्या यह एनपीई पर नहीं होगा args[i].getClass()? मेरा कहना है कि यदि आप तर्क प्रकारों के आधार पर विधि का चयन करते हैं तो यह काम नहीं करता है। यह साथ काम करता है String.format, लेकिन कुछ और के साथ काम नहीं कर सकता है जो स्वीकार करता है null
ट्वीस्टरेब

@TWiStErRob, अच्छी बात है! मैंने एक फ़ंक्शन जोड़ा है जो मैन्युअल रूप से argTypesसरणी पास कर सकता है , इसलिए अब हम nullNullPointerException के बिना तर्क / पैरामीटर पारित कर सकते हैं । नमूना उत्पादन:NullParameterTest: String parameter=null, int parameter=888
लियूयान

3

आप पैटर्न Callbackका उपयोग करके भी कर सकते हैं Delegate:

Callback.java

public interface Callback {
    void onItemSelected(int position);
}

PagerActivity.java

public class PagerActivity implements Callback {

    CustomPagerAdapter mPagerAdapter;

    public PagerActivity() {
        mPagerAdapter = new CustomPagerAdapter(this);
    }

    @Override
    public void onItemSelected(int position) {
        // Do something
        System.out.println("Item " + postion + " selected")
    }
}

CustomPagerAdapter.java

public class CustomPagerAdapter {
    private static final int DEFAULT_POSITION = 1;
    public CustomPagerAdapter(Callback callback) {
        callback.onItemSelected(DEFAULT_POSITION);
    }
}

1

मैंने हाल ही में कुछ ऐसा करना शुरू किया है:

public class Main {
    @FunctionalInterface
    public interface NotDotNetDelegate {
        int doSomething(int a, int b);
    }

    public static void main(String[] args) {
        // in java 8 (lambdas):
        System.out.println(functionThatTakesDelegate((a, b) -> {return a*b;} , 10, 20));

    }

    public static int functionThatTakesDelegate(NotDotNetDelegate del, int a, int b) {
        // ...
        return del.doSomething(a, b);
    }
}

1

यह थोड़ा पुराना है, लेकिन फिर भी ... मुझे पीटर विल्किंसन का जवाब इस तथ्य के अलावा अच्छा लगा कि यह आदिम प्रकार जैसे इंट / इंटेगर के लिए काम नहीं करता है। समस्या इसके .getClass()लिए है parameters[i], जो उदाहरण के लिए लौटता है java.lang.Integer, जो दूसरी तरफ getMethod(methodName,parameters[])(जावा की गलती) द्वारा सही ढंग से व्याख्या नहीं की जाएगी ...

मैंने इसे डैनियल स्प्युकक के सुझाव के साथ जोड़ा ( इसके उत्तर में ); सफलता के कदमों में शामिल हैं: पकड़ना NoSuchMethodException-> getMethods()-> एक-एक करके मिलान की तलाश method.getName()-> और फिर स्पष्ट रूप से मापदंडों की सूची के माध्यम से लूपिंग करना और डेनियल समाधान को लागू करना, जैसे कि मिलान और हस्ताक्षर मिलान की पहचान करना।


0

मुझे लगता है कि अमूर्त वर्ग का उपयोग करना अधिक सुरुचिपूर्ण है, जैसे:

// Something.java

public abstract class Something {   
    public abstract void test();        
    public void usingCallback() {
        System.out.println("This is before callback method");
        test();
        System.out.println("This is after callback method");
    }
}

// CallbackTest.java

public class CallbackTest extends Something {
    @Override
    public void test() {
        System.out.println("This is inside CallbackTest!");
    }

    public static void main(String[] args) {
        CallbackTest myTest = new CallbackTest();
        myTest.usingCallback();
    }    
}

/*
Output:
This is before callback method
This is inside CallbackTest!
This is after callback method
*/

यह बहुरूपता है, कॉलबैक नहीं। आपको कॉलबैक पैटर्न की जांच करने की आवश्यकता है।
सिमो .792

हां मैं सुपर क्लास से कॉलबैक करने के लिए बहुरूपता का उपयोग कर रहा हूं। आपको यह कार्यक्षमता केवल बहुरूपता से नहीं मिलती है। मैं कॉलबैक () का उपयोग कर रहा हूं, जो कि क्लास समथिंग में है, फिर यह सबक्लास पर कॉल करता है, जहां उपयोगकर्ता ने अपना फ़ंक्शन टेस्ट () लिखा है।
अवतार 1337 5

2
कॉलबैक को एक के objectलिए "सूचित" करने के लिए डिज़ाइन किया गया है objectजब कुछ महत्वपूर्ण हुआ है, तो दूसरा objectघटना को संभाल सकता है। तुम्हारा abstract classकभी कोई अलग नहीं है object, यह केवल एक अलग है class। आप केवल एक का उपयोग कर रहे हैं objectऔर classesविभिन्न कार्यों को करने के लिए अलग-अलग हो रहे हैं, जो कि बहुरूपता का सार है, कॉलबैक पैटर्न नहीं।
simo.3792

0
public class HelloWorldAnonymousClasses {

    //this is an interface with only one method
    interface HelloWorld {
        public void printSomething(String something);
    }

    //this is a simple function called from main()
    public void sayHello() {

    //this is an object with interface reference followed by the definition of the interface itself

        new HelloWorld() {
            public void printSomething(String something) {
                System.out.println("Hello " + something);
            }
        }.printSomething("Abhi");

     //imagine this as an object which is calling the function'printSomething()"
    }

    public static void main(String... args) {
        HelloWorldAnonymousClasses myApp =
                new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }
}
//Output is "Hello Abhi"

मूल रूप से यदि आप एक इंटरफ़ेस की वस्तु बनाना चाहते हैं तो यह संभव नहीं है, क्योंकि इंटरफ़ेस में ऑब्जेक्ट नहीं हो सकते।

विकल्प यह है कि कुछ वर्ग इंटरफ़ेस को लागू करें और फिर उस वर्ग के ऑब्जेक्ट का उपयोग करके उस फ़ंक्शन को कॉल करें। लेकिन यह दृष्टिकोण वास्तव में क्रियात्मक है।

वैकल्पिक रूप से, नया HelloWorld () लिखें (* यह एक इंटरफ़ेस है एक वर्ग नहीं है) का निरीक्षण करें और फिर इसे स्वयं इंटरफ़ेस विधियों के बचाव के साथ पालन करें। (* यह दोष वास्तव में अनाम वर्ग का है)। फिर आपको ऑब्जेक्ट संदर्भ मिलता है जिसके माध्यम से आप स्वयं विधि को कॉल कर सकते हैं।


0

एक इंटरफ़ेस बनाएँ, और कॉलबैक क्लास में एक ही इंटरफ़ेस प्रॉपर्टी बनाएँ।

interface dataFetchDelegate {
    void didFetchdata(String data);
}
//callback class
public class BackendManager{
   public dataFetchDelegate Delegate;

   public void getData() {
       //Do something, Http calls/ Any other work
       Delegate.didFetchdata("this is callbackdata");
   }

}

अब जिस कक्षा में आप वापस जाना चाहते हैं, ऊपर दिए गए इंटरफ़ेस को लागू करना चाहते हैं। और अपनी कक्षा के इस "ऑब्जेक्ट / संदर्भ" को "पास" कहें, जिसे वापस बुलाया जाएगा।

public class Main implements dataFetchDelegate
{       
    public static void main( String[] args )
    {
        new Main().getDatafromBackend();
    }

    public void getDatafromBackend() {
        BackendManager inc = new BackendManager();
        //Pass this object as reference.in this Scenario this is Main Object            
        inc.Delegate = this;
        //make call
        inc.getData();
    }

    //This method is called after task/Code Completion
    public void didFetchdata(String callbackData) {
        // TODO Auto-generated method stub
        System.out.println(callbackData);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.