2012-06-06 9 views
6

मैं बहुत जावा के लिए नया हूँ, लेकिन मैं (यह हाथ से टाइप किया प्रोटोटाइप सिर्फ मैं क्या जरूरत है वर्णन करने के लिए)जावा में कॉलबैक के साथ फ़ंक्शन कैसे कॉल करें जैसे मैं इसे सी # में करता हूं?

private void ParentFunc() 
{ 
    var worker = new WorkerClass() 

    worker.DoWork(e => console.Write("Progress" + e)); 


} 

public class WorkerClass() 
{ 
    public method DoWork(Action<int> callback) 
    { 
     for (int i=1; i<1000; i++) callback.Invoke(i); 
    } 
} 

लिटिल स्पष्टीकरण इस सी # कोड की तरह कुछ लिखने के लिए की जरूरत है। मैं एंड्रॉइड में AsyncTask का उपयोग कर रहा हूं और क्लास के बाहर प्रोसेसर को कॉल कर रहा हूं लेकिन उन्हें वापस सिग्नल करना चाहूंगा ताकि मैं publishProgress कर सकूं।

interface CallBack<P> 
{ 
    public void callback(P p); 
} 

class MyCallBack implements CallBack<String> { 
    public void callBack(String p) { 
    System.out.println(p); 
    } 
} 

class WorkerClass { 
    public void doWork(CallBack<String> callback) 
    { 
    // do work 
    callback.callBack("Done!"); 
    } 
} 

WorkerClass wc = new WorkerClass(); 
wc.doWork(new MyCallBack()); 

मैं गुमनाम वर्गों का उपयोग करने क्योंकि मैं उन्हें काफी बरसाती कोट वाक्य रचना जब तक वर्बोज़ पाते हैं कि आप सुझाव देने के लिए नहीं जा रहा हूँ: मैं अपने AsyncTask

+3

वाई जावा 8 के लिए टी :) – Torious

+2

[जावा में कॉलबैक फ़ंक्शन] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/443708/callback-functions-in-java) – assylias

उत्तर

6

के बाद से बंद अभी तक समर्थित नहीं हैं आप इंटरफ़ेस और गुमनाम आंतरिक वर्ग का उपयोग करने के लिए है।

private void ParentFunc { 
    WorkerClass worker = new WorkerClass(); 

    worker.doWork(new Callback<Integer>() { 
     public void invoke(Integer arg) { 
      System.out.println("Progress" + arg); 
     } 
    }); 
} 

public class WorkerClass { 
    public doWork(Callback<Integer> callback) { 
     for (int i=1; i<1000; i++) callback.invoke(i); 
    } 
} 

public interface Callback<T> { 
    public void invoke(T arg); 
} 
4

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

5

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

interface MyAction { 
    void doit(String str); 
} 

class WorkerClass { 
    void doWork(MyAction action); 
} 

void main(String args[]) { 
    WorkerClass worker = new WorkerClass(); 
    worker.doWork(new MyAction { 
     public void doit(String e) { 
      System.out.println("Progress" + e) 
     } 
    }); 
} 
+0

var? क्या यह जावा या सी # है? –

+0

@ Eng.Fouad ओह, मैं बहुत लंबे समय तक सी # में कोडिंग कर रहा हूं :) धन्यवाद! – dasblinkenlight

0

यह डुप्लिकेट सवाल का मेरा उत्तर देखें जावा 8. के ​​साथ संभव है:

https://stackoverflow.com/a/26776520/1206998

तर्क के रूप में एक समारोह का उपयोग करें:

import java.util.function.Function; 

public String applyFunction(Function<String,String> function){ 
     return function.apply("what ever"); 
} 

कॉल

// with someObject.someMethod(String) => String 
xxx.applyFunction(someObject::someMethod); 
संबंधित मुद्दे

 संबंधित मुद्दे