getClass () عبارة وأساليب ثابتة: ما هو أفضل الممارسات؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

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

وأي اقتراحات أخرى؟

ملاحظة جانبية: النهج المذكور أعلاه هو أيضا الطريقة الوحيدة التي أنا على علم من الحصول على طريقة الدعوة

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

المحلول

وعندما تكون في أسلوب ثابت، ما هو الضمان أن بعض (أي) فئة التي امتدت من يدكم على المكدس؟

إذا كنت تفكر في هذا قليلا، وأظن أنك سوف تدرك ما كنت تبحث عنها غير موجودة.

و/ تحرير / 1 أعتقد أن ما تحتاجه هو

abstract class B {
    <T extends B> B create(Class<T> clazz) {
    ....
}

وهممم. ماذا لو create هو طريقة protected؟ ثم هل يمكن أن يكون متأكد من المتصل هو B، يمكنك أن تطلب حتى أن رمي UnsupportedOperation أو IllegalState إذا كان الطالب لا تنازل لB.

ويمكنك استخدام Thread.currentThread().getStackTrace()

نصائح أخرى

والمشي على كومة ليست بالضرورة آمنة للقيام أسف:

ومن جافادوك JDK 6 لgetStackTrace:

<اقتباس فقرة>   

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

هل يمكن، ربما، استخدام API المصحح للقيام بذلك. وأعتقد أن الأشياء التصحيح قادرا على استخدام بؤرة بأقصى سرعة (قد أكون مخطئا) بحيث أنك لن ترى سرعة كبيرة تصل لفعل ذلك. قد تبدأ من خلال النظر في: HTTP: // جافا .sun.com / javase / 6 / مستندات / technotes / أدلة / JPDA / trace.html

وأيضا، بناء على Unanswereds الجواب ...

class Base
{
    // instance method helper
    public final int foo()
    {
        return (foo(this.getClass()));
    }

    // the real helper, with access to the class
    private static int foo(final Class clazz)
    {
        return (0);
    }
}

class Child
    extends Base
{
    public void bar()
    {
        final int x;

        x = foo();
    }
}

وخلق ومكلفة جدا، لذلك لا تستخدم هذا إذا يسمى قابل للظهور طريقة في كثير من الأحيان (.e.g. أكثر من مرة واحدة في الثانية) نهج طفيف الأفضل هو Thread.currentThread (). getStackTrace ().

وثمة نهج آخر إذا كنت تستخدم JVM الشمس هو Reflection.getCallerClass (ن). هذا أسرع بكثير ولكن لا المحمولة إلى JVMs أخرى. إذا كنت تشعر بالقلق إزاء هذا هل يمكن أن يكون طريقة أخرى مما يستدعي هذا إذا به المتاحة ويستخدم تتبع المكدس إن لم يكن.

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

وأقترح تجنب مستنقع التفكير. يبدو أنك تفعل بعض نوع من البرمجة مباشرة. استخدام تطبيق بسيط (ليس هناك ما يكفي من المعلومات لتقديم تخمين معقول ما يمكن أن يكون).

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