سؤال

في C# يمكنك تحديد المندوبين بشكل مجهول (على الرغم من أنهم ليسوا أكثر من سكر نحوي).على سبيل المثال، يمكنني القيام بذلك:

public string DoSomething(Func<string, string> someDelegate)
{
     // Do something involving someDelegate(string s)
} 

DoSomething(delegate(string s){ return s += "asd"; });
DoSomething(delegate(string s){ return s.Reverse(); });

هل من الممكن تمرير رمز مثل هذا في جافا؟أنا أستخدم إطار المعالجة، الذي يحتوي على إصدار قديم جدًا من Java (لا يحتوي على أدوية عامة).

هل كانت مفيدة؟

المحلول

ما قبل جافا 8:

أقرب ما تحتاج إليه Java للمفوضين هي واجهات الطريقة الواحدة.يمكنك استخدام فئة داخلية مجهولة.

interface StringFunc {
   String func(String s);
}

void doSomething(StringFunc funk) {
   System.out.println(funk.func("whatever"));
}

doSomething(new StringFunc() {
      public String func(String s) {
           return s + "asd";
      }
   });


doSomething(new StringFunc() {
      public String func(String s) {
           return new StringBuffer(s).reverse().toString();
      }
   });

جافا 8 وما فوق:

جافا 8 يضيف تعبيرات لامدا إلى اللغة.

    doSomething((t) -> t + "asd");
    doSomething((t) -> new StringBuilder(t).reverse().toString());

نصائح أخرى

وليس بالضبط مثل هذا ولكن جافا شيئا من هذا القبيل.

وانه دعا الطبقات الداخلية مجهولة.

واسمحوا لي أن أقدم لكم مثالا:

DoSomething(new Runnable() {
   public void run() {
       // "delegate" body
   }
});

وانها أكثر من ذلك بقليل مطول ويتطلب واجهة لتنفيذ، ولكن بخلاف ذلك انها الى حد كبير نفس الشيء

والمثال لديك قد تبدو هذه في جاوة، وذلك باستخدام الطبقات الداخلية مجهول:

interface Func {
    String execute(String s);
}

public String doSomething(Func someDelegate) {
    // Do something involving someDelegate.execute(String s)
}

doSomething(new Func() { public String execute(String s) { return s + "asd"; } });
doSomething(new Func() { public String execute(String s) { return new StringBuilder(s).reverse().toString(); } } });
<اقتباس فقرة>   

هل من الممكن لتمرير قانون من هذا القبيل   في جافا؟ أنا باستخدام المعالجة   الإطار، والتي لديها قديمة جدا   نسخة جافا (ليس لديها   الأدوية).

ولأن المسألة ردا على سؤال حول الجواب معالجة محددة، ليس هناك ما يعادلها المباشر. ولكن المعالجة يستخدم مستوى لغة جافا 1.4، وجافا 1.1 قدم الطبقات الداخلية مجهول، والتي هي تقريبية.

وعلى سبيل المثال:

public class Delegate
{
    interface Func
    {
        void execute(String s);
    }

    public static void doSomething(Func someDelegate) {
        someDelegate.execute("123");
    }

    public static void main(String [] args)
    {

        Func someFuncImplementation = new Func() 
        {
            @Override
            public void execute(String s) {
                System.out.println("Bla Bla :"  + s);
            }
        };

        Func someOtherFuncImplementation = new Func() 
        {
            @Override
            public void execute(String s) {
                System.out.println("Foo Bar:"  + s);
            }
        };


        doSomething(someFuncImplementation);
        doSomething(someOtherFuncImplementation);
    }
}

وإخراج:

<اقتباس فقرة>   

وتحرير بلوخ: 123

     

وفو بار: 123

لقد نسيتم جميعًا هنا أن مندوب C# هو في المقام الأول الخيط آمن.هذه الأمثلة مخصصة فقط لتطبيق موضوع واحد.

تتم كتابة معظم التطبيقات المعاصرة على مفهوم متعدد الخيوط.لذلك لا إجابة واحدة هي الجواب.

لا يوجد ما يعادلها في جافا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top