سؤال

أنا أكتب تطبيق Java باستخدام أدوات SWT.أرغب في تحديث حالة بعض عناصر واجهة المستخدم عند حدوث حدث معين (على سبيل المثال، تحديث حالة نموذج البيانات).

هل يوجد شيء في Java مشابه لـ NSNotificationCenter الخاص بـ Cocoa، حيث يمكنني تسجيل كائن للاستماع إلى أحداث الإشعارات والرد عليها، بالإضافة إلى جعل الكائنات الأخرى "تطلق" إشعارًا؟

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

المحلول

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

public interface ScanListener
{
  public void scanStarted();
  public void scanCompleted();
}

والآن لودر يعرف طريقة لرمز آخر لتسجيل لالاسترجاعات، مثل

public void addScanListener(ScanListener listener)
{
  listeners.add(listener);
}

ومحمل، عندما يبدأ الفحص، ينفذ التعليمات البرمجية التالية

for (ScanListener listener : listeners)
{
  listener.scanStarted();
}

وعندما ينتهي، فإنه يفعل الشيء نفسه مع listener.scanCompleted ()؛

والتعليمات البرمجية التي يجب أن يتم إخطار من هذه الأحداث تنفذ تلك الواجهة (إما أنفسهم، أو في الطبقة الداخلية)، ويدعو "loader.addScanListener (هذا)". ويطلق على scanStarted () وscanCompleted () الأساليب في الأوقات المناسبة. يمكنك أن تفعل حتى هذا مع الاسترجاعات التي تأخذ الوسائط و / أو إرجاع النتائج. الأمر كله متروك لكم.

نصائح أخرى

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

وليس هناك موجودة مسبقا خدمة لكل عملية أن ترسل الأحداث في جافا وهذا ما يعادل الافتراضي NSNotificationCenter. في جافا، يتم تحديد نوع الحدث من قبل الكائن الحدث كونه نوع معين (وهو ما يعني أيضا أن طريقة التبليغ يعتمد على هذا النوع) بدلا من استخدام السلسلة. قبل الأدوية، وكتابة المرسل العام الحدث والمتلقي الذي هو أيضا typesafe ليس من الممكن حقا (يشهد انتشار * فصول الحدث و* واجهات EventListener في المكتبات AWT والربيع).

وهناك بعض المرافق لإرسالها الحدث. كما وذكر بول، هناك java.util.Observable، والتي كما كنت أشير، ويتطلب إن شاء subclasses ترث. وهناك أيضا java.beans.PropertyChangeSupport، والتي يمكن أن تكون مفيدة اعتمادا على الوضع الخاص بك.

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

والآن بعد أن الأدوية موجودة في جاوة، فإن مكتبة ارسال الحدث عامة يكون ممكنا. ومع ذلك، أنا لم تأتي عبر أي. أي شخص؟

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

وقال ذلك، ومع ذلك، فإنه لا وجود لها.

وانها JMX.

وإنشاء MBeans، ومن ثم يمكن للآخرين تسجيل للأحداث من تلك MBeans. يمكن للMBean ثم ترسل من الإعلام.

وأنا شخصيا لن تنظر في استخدامه لهذه الحالة (فما استقاموا لكم فاستقيموا قصف للتو بلدي)، ولكن المرفق هناك واضحة المعالم وموثقة.

في جاوة هذا سيكون مزود إطلاق الإخطارات لمستمعيها. لكن جافا لا تقدم اقتران فضفاض تحصل مع NSNotification الكاكاو لأن في مقدمي جافا والمشتركين يجب أن يكون كل ما يشير إلى بعضها البعض. مقارنة لهذا الفصل 18 في "تعرف على الهدف-C لمطوري جافا".


يوجد تنفيذ دائرة الرقابة الداخلية NSNotificationCenter في جافا.
يمكنك العثور على كود المصادر في:هذا المشروع جيثب

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