سؤال

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

Typedef myGenDef = < Object1, Object2 >;

HashMap< myGenDef > hm = new HashMap< myGenDef >();

for (Entry< myGenDef > ent : hm..entrySet())
{
.
.
.
}
هل كانت مفيدة؟

المحلول

هناك النمط المضاد للنمط الزائف...

class StringList extends ArrayList<String> { }

أشياء جيدة، اشرب!؛-)

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

نصائح أخرى

في الطريقة العامة، يمكنك استخدام نموذج محدود من استنتاج النوع لتجنب بعض التكرار.

مثال:إذا كان لديك الوظيفة

    <K, V> Map<K, V> getSomething() {
        //...
    }

يمكنك استخدام:

final Map<String, Object> something = getsomething();

بدلاً من:

final Map<String, Object> something = this.<String, Object>getsomething();

يستخدم نمط المصنع لإنشاء الأدوية العامة:

عينة الطريقة:

public Map<String, Integer> createGenMap(){
        return new HashMap<String,Integer>();

    }

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

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

class A {
     private Map<String, Integer> values = new HashMap<String, Integer>();
}

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

لا.على الرغم من ذلك، فإن لغة Groovy، وهي لغة JVM، تتم كتابتها ديناميكيًا وتتيح لك الكتابة:

def map = new HashMap<complicated generic expression>();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top