كيف يمكنني نقل متغير إلى إعلان جديد قابل للتشغيل؟ [مكرر

StackOverflow https://stackoverflow.com/questions/4297261

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

لدي ما يلي:

Runnable done = new Runnable()
    {
        public void run()
        {
            System.out.println("Hello");
        }
    };

ثم في نشاط Android الخاص بي ، سأسمي شيئًا مثل:

runOnUIThread(done);

الذي أتصل به بعد ذلك. ومع ذلك ، أريد ذلك "Hello" لا يجب أن تكون متشددًا ، حتى أتمكن من تمريرها. وإلا ، سأضطر إلى الحصول على واحدة من هذه الإعلانات لكل سلسلة أريد طباعتها.

(هذا هو في الواقع سؤال Android ، ولكنه قام بتخفيفه إلى Java الأساسي لذلك من الأسهل الإجابة)

شكرًا

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

المحلول

final String hello = whereverItsComingFrom;
Runnable done = new Runnable()
    {
        public void run()
        {
            System.out.println(hello);
        }
    };

نصائح أخرى

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

ولكن لديها 2 عيوب:

  • يجب أن يكون المتغير "Hello" نهائيًا ،

  • لدى الفئة المجهولة إشارة داخلية إلى مثيل الفئة الخارجية - وهذا يعني أن الفئة الخارجية التي يتم الاحتفاظ بها عندما تكون مؤهلة لجمع القمامة. SEE: Java الفعالة [Joshua Bloch] ، البند 22: تفضيل فصول الأعضاء الثابتة على غير ثابت

وفي رأيي المتواضع ، من الممارسات السيئة تحديد مثيل الفصل بهذه الطريقة.

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

class Demo {
...

  private static class MyRunnable implements Runnable {
     private final String message;

     MyRunnable(final String message) {
       this.message = message;
     }

     public void run() {
       System.out.println(message);
     }
  }

  public void startThread() {
    MyRunnable myRunnable = new MyRunnable("Hello");

    runOnUIThread(myRunnable); 
  }
...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top