জাভায় কলব্যাক ফাংশন


177

জাভা পদ্ধতিতে কল ব্যাক ফাংশনটি পাশ করার কোনও উপায় আছে কি?

আমি যে আচরণটি নকল করার চেষ্টা করছি সেটি হ'ল নেট ডেলিগেটকে কোনও ফাংশনে স্থান দেওয়া হচ্ছে।

আমি লোককে একটি পৃথক অবজেক্ট তৈরি করার পরামর্শ দিয়েছি কিন্তু এটি ওভারকিল বলে মনে হচ্ছে, তবে আমি সচেতন যে কখনও কখনও ওভারকিলই জিনিসগুলি করার একমাত্র উপায়।


51
এটি ওভারকিল কারণ জাভা অকার্যকর (এটি একটি পাং বলে মনে হচ্ছে ...)।
কিথ পিনসন

আরেকটি জাভা 8 উদাহরণ: স্ট্যাকওভারফ্লো / প্রশ্ন
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
আমি এটি ব্যবহার করেছি, এটি আমি যা চাই তার চেয়ে কম ভারবস, তবে এটি কার্যকর হয় it
ওমর কোহেজি 16

23
@ ওমর, একমত আমি সি # এর সাথে দীর্ঘ মেয়াদে জাভাতে ফিরে এসেছি এবং সত্যিই ল্যাম্বডাস / প্রতিনিধিদের মিস করছি। এসো জাভা!
ড্রয় নোকস

4
@DrewNoakes, ভাল খবর, জাভা 8 (বেশিরভাগই) lambdas আছে ...
লুকাস

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
কলব্যাক্সের জন্য, আপনার নিজের ফাংশনাল ইন্টারফেসটি লেখাই ভাল হবে কারণ প্রতিটি কলব্যাক টাইপের সাধারণত একাধিক বাক্য গঠন থাকে।
শ্রী হর্ষ চিলাকাপতি

আমি বুঝতে পারছি না। যদি ক্লাসগুলির মধ্যে java.util.functionএকটি যদি আপনি যা সন্ধান করছেন তা যদি হয় তবে আপনি যেতে ভাল। তারপরে আপনি I / O এর জন্য জেনেরিকের সাথে খেলতে পারেন। (?)
জুহ_

আপনি আমাকে পাননি, আমি যা বলেছিলাম তা সি ++ কোড অনুবাদ করার বিষয়ে যা জাভা 8-তে কলব্যাক ফাংশন ব্যবহার করে, সেখানে, প্রতিটি অনন্য ফাংশন পয়েন্টারের জন্য আপনাকে জাভাতে একটি ফাংশনাল ইন্টারফেস তৈরি করতে হবে, যেহেতু বাস্তবের আরও পরামিতি থাকবে উৎপাদন কোড.
শ্রী হর্ষ চিলকাপতি

2
আমার উপসংহারটি হল যে বেশিরভাগ সময় আপনাকে নিজের ফাংশনাল ইন্টারফেসগুলি লিখতে হয় যেহেতু ডিফল্ট সরবরাহ করা java.util.functionযথেষ্ট নয় are
শ্রী হর্ষ চিলকাপতি

1
আমি বিদ্যমান ফাংশনাল ইন্টারফেস এবং কীভাবে নতুন তৈরি করব সে সম্পর্কে একটি নোট যুক্ত করেছি
জুহ_

28

সরলতার জন্য, আপনি একটি চলমান ব্যবহার করতে পারেন :

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

সামান্য নিটপিকিং:

আমি দেখেছি লোকেরা একটি পৃথক বস্তু তৈরি করার পরামর্শ দিচ্ছে তবে এটি অতিমাত্রার বলে মনে হচ্ছে

কলব্যাক পাস করার মধ্যে যে কোনও ওও ভাষায় আলাদা আলাদা অবজেক্ট তৈরি করা অন্তর্ভুক্ত, সুতরাং এটি ওভারকিলকে খুব কমই বিবেচনা করা যায়। আপনি সম্ভবত যা বোঝাতে চেয়েছেন তা হচ্ছে জাভাতে, আপনার আলাদা শ্রেণি তৈরি করা দরকার, যা প্রথম শ্রেণীর ফাংশন বা ক্লোজারগুলির সাথে স্পষ্ট ভাষায় তুলনায় আরও ভার্বোস (এবং আরও সংস্থান-নিবিড়) is তবে, বেনামে ক্লাসগুলি কমপক্ষে ভার্বোসিটি হ্রাস করে এবং ইনলাইন ব্যবহার করা যেতে পারে।


12
হ্যাঁ আমি এটাই বোঝাতে চাইছিলাম 30 বা ততোধিক ইভেন্টের সাথে আপনি 30 ক্লাস সমাপ্ত হন।
ওমর কোহেজি

16

তবুও আমি দেখতে পাচ্ছি যে সর্বাধিক পছন্দের উপায়টি আমি যা খুঁজছিলাম তা ছিল .. এটি মূলত এই উত্তরগুলি থেকে উদ্ভূত হয়েছে তবে আমি এটিকে আরও বেশি অপ্রয়োজনীয় এবং দক্ষতার সাথে চালিত করতে হয়েছিল ... এবং আমি মনে করি যে আমি কী নিয়ে আসছি তা প্রত্যেকে খুঁজছেন

যথাযথ::

প্রথমে একটি ইন্টারফেস করতে যে সহজ

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

ফলাফলগুলি হ্যান্ডেল করার জন্য যখনই আপনি চান তখন এখন এই কলব্যাকটি চালানোর জন্য - অ্যাসিঙ্ক কল হওয়ার পরে সম্ভবত আপনি এমন কিছু জিনিস চালাতে চান যা এই পুনর্বাসনের উপর নির্ভর করে

// 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();
    }
}

যুক্তি দিয়ে কি এমন হবে? পেস্টবিন.
com

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);
        }
    }
}

ওভারকিলের মতো দেখতে কিছুটা (/ আমার হাঁস)
ডায়েডেরিক

ব্যবহারের সংখ্যা এবং প্রকল্পের আকারের উপর নির্ভর করে: কয়েকটি শ্রেণির প্রকল্পের জন্য ওভারকিল, একটি বড়টিতে ব্যবহারিক।
জুহ_

এছাড়াও, @ মোমনুর উত্তরটি দেখুন
જુহ_

5

একটি পদ্ধতি জাভাতে (এখনও) প্রথম-শ্রেণীর অবজেক্ট নয়; আপনি কলব্যাক হিসাবে কোনও ফাংশন পয়েন্টারটি পাস করতে পারবেন না। পরিবর্তে, এমন কোনও বস্তু তৈরি করুন (যা সাধারণত কোনও ইন্টারফেস প্রয়োগ করে) যা আপনার প্রয়োজনীয় পদ্ধতিটি ধারণ করে এবং এটি পাস করে।

জাভাতে বন্ধ হওয়ার প্রস্তাবগুলি - যা আপনি যে আচরণটির সন্ধান করছেন তা সরবরাহ করবে but তবে আসন্ন জাভা 7 রিলিজের মধ্যে কোনওটিই অন্তর্ভুক্ত হবে না।


1
"একটি পদ্ধতি জাভাতে (এখনও) প্রথম-শ্রেণীর অবজেক্ট নয়" - ভাল, পদ্ধতি শ্রেণিটি [1] রয়েছে, যার মধ্যে আপনি অবশ্যই উদাহরণগুলির চারপাশে পাস করতে পারেন। এটি জাভা থেকে আপনি যে প্রত্যাশা করছিলেন তা পরিষ্কার, অহঙ্কারী, ওও কোড নয়, তবে এটি সমীচীন হতে পারে। অবশ্যই কিছু বিবেচনা করার জন্য, যদিও। [1] 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 ();
    }
}

আপনি কীভাবে নালাকে একটি আর্গ হিসাবে পাস করবেন?
TWiStErRob

@TWiStErRob, এই নমুনায় এটির মতো হবে timer.SetTimer ((int)(Math.random ()*10), System.out, "printf", "%s: [%s]", new Object[]{"null test", null});। আউটপুট হবেnull test: [null]
লিউইয়ান 刘 研

এটি এনপিই চালু করবে না args[i].getClass()? আমার বক্তব্যটি হ'ল আপনি যদি যুক্তির ধরণের ভিত্তিতে পদ্ধতি নির্বাচন করেন তবে এটি কাজ করে না। এটি সাথে কাজ করে String.format, তবে গ্রহণযোগ্য কিছু অন্যের সাথে কাজ নাও করতে পারে null
TWiStErRob

@TWiStErRob, ভাল পয়েন্ট! আমি একটি ফাংশন যুক্ত করেছি যা ম্যানুয়ালি argTypesঅ্যারে পাস করতে পারে , তাই এখন আমরা nullনালপয়েন্টার এক্সসেপশন না ঘটলে আর্গুমেন্ট / প্যারামিটারটি পাস করতে পারি । নমুনা আউটপুট: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
*/

এটি বহুবর্ষ, কলব্যাক নয়। আপনার কলব্যাক প্যাটার্ন পরীক্ষা করা দরকার।
simo.3792

হ্যাঁ আমি সুপার ক্লাস থেকে কলব্যাক করতে পলিমারফিজমটি ব্যবহার করছি। আপনি এই বহুবচন দ্বারা কার্যকারিতা পাবেন না। আমি কলব্যাক () যা কিছু ক্লাসে রয়েছে তা ব্যবহার করে কল করছি, তারপরে এটি আবার সাবক্লাসে কল করে যেখানে ব্যবহারকারী তার ফাংশন পরীক্ষা () লিখেছেন।
অবতার 1337

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"

মূলত আপনি যদি কোনও ইন্টারফেসের অবজেক্টটি তৈরি করতে চান তবে এটি সম্ভব নয়, কারণ ইন্টারফেসে বস্তু থাকতে পারে না।

বিকল্পটি হ'ল কিছু শ্রেণি ইন্টারফেসটি প্রয়োগ করতে দেয় এবং তারপরে সেই শ্রেণীর অবজেক্টটি ব্যবহার করে সেই ফাংশনটি কল করে। তবে এই পদ্ধতিটি সত্যই ভার্জোজ।

বিকল্পভাবে, নতুন হ্যালো ওয়ার্ল্ড () লিখুন (* এটি ইন্টারফেসটি কোনও শ্রেণি নয়) এবং তারপরে ইন্টারফেসের পদ্ধতিগুলির সংজ্ঞা দিয়ে এটি অনুসরণ করুন। (* এই সংজ্ঞাটি বাস্তবে বেনাম শ্রেণি)। তারপরে আপনি সেই অবজেক্ট রেফারেন্স পাবেন যার মাধ্যমে আপনি নিজেই পদ্ধতিটিকে কল করতে পারেন।


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);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.