سؤال

Lamdbaj يسمح تعريف الإغلاق في لغة جافا مختلفة يمكن العثور على أمثلة هنا

سؤالي يتعلق الأساسية جافا آليات في استخدامها ، على سبيل المثال ، تحديد println إغلاق التعليمة البرمجية التالية المستخدمة:

Closure println = closure(); 
{ of(System.out).println(var(String.class)); }

هذا الإغلاق ويمكن بعد ذلك يتم تنفيذها عبر:

println.apply("foobar");

أنا الغريب ما الآليات في جافا تسمح الدعوة إلى of(...).println(...) لتصبح المرتبطة println الحالة نفسها.

وبطبيعة الحال ، lambdaj شفرة المصدر متاحة للقراءة ولكن كنت آمل في مستوى أعلى قليلا التفسير إذا كان أي شخص لديه واحد.انعكاس بلدي المهارات تذهب بعيدا قليلا من التأمل وتنفيذ طرق حيوي.

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

المحلول

حسنا ، of هو يفترض static الطريقة التي يتم استيرادها بشكل ثابت حتى يمكن أن يطلق عليه دون أرفق اسم الفئة.أتوقع أن var هو نفسه.كلتا الطريقتين يجب أن يعود بعض الأنواع التي لديها أساليب ما يسمى في وقت لاحق:

public class Printable {
  public void println(Var var);
}

public class Fac {
  public static Printable of(Object o) {
    return new Printable(o);
  }

  public static Var var(Class<?> clazz) {
    return new Var(clazz);
  }

} 

فجأة:

Fac.of(System.out).println(Fac.var(String.class));

صالحة جافا.وذلك باستخدام ثابت الواردات ، مهلا المعزوفة:

import static Fac.*;

of(System.out).println(var(String.class));

مجعد بين الأقواس هي من الواضح صالح جافا كما يمكنك إضافة هذه في أي وسيلة للمساعدة في تعريف معجمي سوبي.هذا API-تصميم أسلوب يسمى بطلاقة و هو أفضل عرض من قبل JMock اختبار المكتبة.

بالمناسبة, إذا كان هذا هو المفترض أن أعرض الإغلاق جافا, انها سخيفة جدا - بناء الجملة هو unreadably فظيعة.I/O على سبيل المثال في الواقع جعلني أضحك بصوت عال.محاولة سكالا!

تحرير - اثنين println المكالمات ترتبط أعتقد لأن أول سلسلة من المكالمات تسمح المكتبة التقاط المتغيرات التي مرت في المعلمات.هذه هي على الأرجح القبض في بعض ThreadLocal هيكل.عندما كنت ثم استدعاء (كما يفترض ثابت) println طريقة المكتبة باستخدام هذه البيانات التي تم التقاطها في الواقع لتنفيذ السلوك في وقت لاحق.أيضا اختبار ذات الصلة ، EasyMock اختبار يستخدم إطار آلية مماثلة (الذي يستخدم جافا وكلاء في الخلفية) لالتقاط القيم المتوقعة.

نصائح أخرى

وأنا ماريو فوسكو وأنا المطور الرئيسي للمكتبة lambdaj.

وأولا وقبل كل شيء أود أن أوضح شيئا: ليس المقصود lambdaj ليحل محل أي لغة وظيفية. وكما قلت في الأسبوع الماضي في خطابي في إبريق من زيوريخ إذا كان لديك فرصة لاستخدام سكالا، لأنها تذهب وننظر إلى الوراء أبدا. هنا يمكنك العثور على استئناف خطابي حيث جاء فيها بوضوح ما يلي:

http://ctpjava.blogspot.com/ 2009/10 / lambdaj جديدة-اتجاهات في java.html

وأنا سكالا المطور سعيدة جدا. لكن في بعض الأحيان يتوجب عليك فقط أن تتطور في جافا (في تجربتي، في العالم الحقيقي، حوالي 80٪ من الأوقات التي لا يمكن أن تختار اللغة التي لديك لكتابة التعليمات البرمجية) وفي هذه الحالة بعض الميزات lambdaj يمكن أن يكون مفيدة (أو آمل ذلك). أردت فقط أن يحضر إلى جاوة بعض الميزات الفنية التي مفقودة تماما. وبطبيعة الحال فإن النتيجة ليست مرضية تماما ويرجع ذلك أساسا إلى الحد الذي تفرضه جافا نفسها.

وأما بالنسبة للآلية lambdaj الداخلية، نعم أنه يستخدم ThreadLocal من أجل تحقيق تلك النتيجة. إذا كان لديك أسئلة أخرى، الفضول أو اقتراحات أفضل والنقاد بناء حول lambdaj ربما كنت قد تكون مهتمة لتسجيل نفسك إلى قائمة lambdaj البريدية هنا:

http://groups.google.com/group/lambdaj

وداعا ماريو

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