كيفية إعلان وظيفة خلال برنامج التنفيذ ؟
-
05-07-2019 - |
سؤال
هذا هو شيء من هذا القبيل انعكاس حيث يمكنك استدعاء الأسلوب ببساطة عن طريق الاسم, و لا precompiled مؤشر على ذلك.
مثل جافا سكريبت يمكنك:
var fun = function(){ alert("Hello World!"); }
fun();
هو شيء مثل هذا ممكن في جافا/J2ME?كيف ؟
المحلول
إذا كنت تريد مترجم j2me, هل يمكن أن تحقق Hecl: http://www.hecl.org
أنت بالتأكيد لا تستطيع أن تفعل أكثر من 'الهوى' الأشياء التي يمكنك القيام به في الحالات العادية جافا في J2ME.البديل هو عبارة عن سلسلة من إذا/السيف هذا ثم استدعاء الدالة تريد ولكن عليك أن تعرف أنه في وقت مبكر بحيث يمكنك كتابة التعليمات البرمجية التي تفعل ذلك.
نصائح أخرى
وطريقة واحدة لتقليد هذه الوظيفة لإنشاء فئة الاستراتيجية.
interface Function
{
Object call(Object[] arguments);
}
لتفعل ما اقترحتم، فلا تفعل ما يلي (أكثر قليلا مطول، وجافا عادة هو):
static class Fun implements Function
{
public Object call(Object[] arguments)
{
System.out.println("Hello, world");
return null;
}
}
Function fun = new Fun();
fun.call(null);
واعتمادا على الحالة، قد تكون قادرا على استخدام أنواع الأدوية أو بدلا من Object
وObject[]
(في هذه الحالة، وأنا استخدمها لأقصى قدر من المرونة، لكنها لا تعطي كثيرا لك في طريق نوع التحقق حتى أفضل أنها ليست مثالية).
لمزيد من المعلومات، انظر إلى استراتيجية تصميم نمط .
طريقة شائعة الحصول على شيء مثل جافا سكريبت هذا الإغلاق هو استخدام مجهول الطبقات الداخلية.انها الكثير أكثر مطول ، لكنه يتيح لك القيام الى حد كبير نفس الشيء.
Runnable r = new Runnable(){
public void run(){
System.out.println("Hello, world!");
}
};
r.run(); // Prints "Hello, world!"
يمكنك حتى الإشارة المتغيرات في أرفق الطريقة ، إذا كانوا النهائي:
public static Runnable makeGreeter(final String who) {
return new Runnable() {
public void run() {
System.out.println("Hello, " + who + "!");
}
};
}
// ... elsewhere in your program...
Runnable r = makeGreeter("world");
r.run(); // "Hello, world!"
هذا هو معيار الاشياء التي كانت في جاوة منذ البداية. Runnable
هو مفيد جدا واجهة التي ، وفقا Javadocs, "ينبغي أن تنفذ من قبل أي فئة من الحالات التي يراد تنفيذها من خلال موضوع". Runnable
يمكن أن تستخدم في الكثير من المواضيع ، بالطبع ، و يستخدم عادة (في JVM وغيرها) بأنه "شيء التي يمكن تنفيذها" - الى حد كبير تشبه وظيفة في جافا سكريبت.بالطبع, إذا كنت تريد أن تمر الحجج سيكون لديك لجعل الخاصة بك واجهة ، ولكن تلك التي يمكن تنفيذها مجهول أيضا.على سبيل المثال, استخدام @Imagist هو Function
واجهة:
interface Function {
Object call(Object[] arguments);
}
// ...
Function helloSayer = new Function(){
public Object call(Object[] args){
System.out.println("Hello, " + args[0] + "!");
}
};
helloSayer.call(new Object[]{ "world" }); // "Hello, world!"
تحرير: هذا لا علاقة له انعكاس, بالطبع, ولكن ليس هناك انعكاس في المثال الخاص بك إما مجرد وظيفة مجهول.
وهناك ما لا يقل عن عدد قليل من الطرق:
هل يمكن إنشاء فصول في وقت التشغيل مع BCEL ، ولكن لديك لإنشاء bytecodes نفسك. والمدقق في JVM لقد رفض صفك إذا bytecodes تبدو مشكوك فيها. ليس حلا السوبر سهلة ولكن قابلة للتنفيذ.
وتنفيذ صن جافا 6 يشمل الكركدن أو المترجم جافا سكريبت، لذلك يمكنك ربما تفعل ما تحتاج إذا كنت على استعداد لاستخدام القليل من جافا سكريبت.
ولست متأكدا جدا عن هذا ولكن أعتقد إذا كان لديك JDK المثبتة، يمكنك استدعاء javac
من برنامج Java الخاص بك. يمكن تحميل الانتاج javac
لفي وقت التشغيل مع فئة ClassLoader
المخصصة.