ما يعادل أساليب C # المجهولة في جافا؟
-
20-09-2019 - |
سؤال
في 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# هو في المقام الأول الخيط آمن.هذه الأمثلة مخصصة فقط لتطبيق موضوع واحد.
تتم كتابة معظم التطبيقات المعاصرة على مفهوم متعدد الخيوط.لذلك لا إجابة واحدة هي الجواب.
لا يوجد ما يعادلها في جافا