كيف يمكنني نقل متغير إلى إعلان جديد قابل للتشغيل؟ [مكرر
-
28-09-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
لدي ما يلي:
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);
}
...
}