تحلل هذه الورقة الاختلافات بين JDK1.4 و JDK1.5 و JDK1.6 في برمجة Java مع أمثلة. شاركه للرجوع إليه ، على النحو التالي:
ببساطة: هناك اختلافان أكبر بين 1.4 و 1.5. أحدهما هو أن 1.5 يحتوي على جماهير ، والآخر يمكن أن يتغلف تلقائيًا أنواع البيانات المغلفة من ثمانية أنواع من البيانات الأساسية. وهذا هو ، عدد صحيح A = 4 غير مسموح. لا يوجد فرق كبير بين 1.5 و 1.6. 1.6 أعتقد أن معظم التغييرات هي واجهة المستخدم الرسومية ، والتي توفر الكثير من إدارة التخطيط المريحة والتمديد.
خلال هذه الفترة ، انضممت إلى شركة للحكومة الإلكترونية واستخدمت WebLogic8. ثم دعونا نستخدم JDK1.4. غيرت Eclipse إصدار JDK. ومع ذلك ، أصبحت المشاريع السابقة في الأساس شعبية.
★ ميزات جديدة من JDK1.5:
1
2 التعبئة التلقائية/unboxing
3 من أجل
4 استيراد ثابت
5 معلمات الطول المتغير
1. الأدوية الجيرية (تجنب تشغيل الأخطاء التي قد تكون ناتجة عن نوع الصب)
على سبيل المثال:
قائمة ArrayList = new ArrayList () ؛ list.add (عدد صحيح جديد (3)) ؛ list.add (عدد صحيح جديد (4)) ؛ int i = ((integer) (list.get (0))). parseint () ؛
مزعجة للغاية
ArrayList <integer> list = new ArrayList <integer> () ؛ list.add (عدد صحيح جديد (3)) ؛ list.add (عدد صحيح جديد (4)) ؛ int i = list.get (0) .parseint () ؛
2 التعبئة التلقائية/unboxing
يمكن تغيير الجملة الأخيرة من المثال أعلاه إلى:
نسخة الكود كما يلي: int i = list.get (0) ؛
لأن النوع الأصلي وفئة التفاف المقابلة لا تحتاج إلى تحويلها بشكل صريح
3 من أجل
تعزيز الحلقات
int a [] = {......} ؛ // تهيئة لـ (int i: a) {......}لا تستخدم I = 0 ؛ i <A.Length ؛ i ++
4 استيراد ثابت
تم ضبطها مسبقًا java.math
نسخة الكود كما يلي: Math.sqrt () ؛
الآن استيراد ثابت java.lang.math.sqrt ؛
sqrt () ؛
إنه يعادل وجود هذه الطريقة في صفك الخاص
5 معلمات الطول المتغير
int sum (int ... intlist) {int sum ؛ مجموع = 0 ؛ لـ (int i = 0 ؛ i <intlist.length ؛ i ++) {sum+= intlist [i] ؛ } إرجاع مجموع ؛}هناك أي معلمة ، تعاملها كصفيف
★ ميزات جديدة من JDK6.0
معززة لتوضيح بيان حلقة التعليق من المعلمات المتنوعة "المخفية"
يحسن العائدات البرية وعودة التباين لبيانات الحلقة
للتكرار على مجموعات ومصفوفات ، يوفر المحسّن من أجل الحلقة بناء جملة بسيط ومتوافق. هناك نقطتان جديران بالذكر:
1. في حلقة ، يتم حساب تعبير التهيئة مرة واحدة فقط. التعبير int
غير معززة ل:
int sum = 0 ؛ عدد صحيح [] الأرقام = computenumbers () ؛ لـ (int i = 0 ؛ i <number.length ؛ i ++) sum+= number [i] ؛
معزز لـ:
int sum = 0 ؛ لـ (رقم int: computenumbers ()) sum += number ؛
قيود
لا يمكن الوصول إلى التكرار أو التراجع أثناء تعزيز التكرار حلقة
يرجى الاطلاع على المثال التالي:
لـ (int i = 0 ؛ i <number.length ؛ i ++) {if (i! = 0) system.out.print ("،") ؛ system.out.print (number [i]) ؛}هنا مثال آخر:
لـ (iterator <integer> it = n.iterator () ؛ it.hasNext () ؛) if (it.next () <0) it.remove () ؛
تعليقات
معالجة التعليقات موضوع كبير. نظرًا لأن هذه المقالة تركز فقط على ميزات اللغة الأساسية ، فإننا لا نعتزم تغطية جميع أشكالها والمخاطر المحتملة. سنناقش التعليقات التوضيحية المدمجة (Countwarnings ، Ferreced and Override) والقيود على معالجة التعليقات التوضيحية العامة.
قمع التحذيرات
يؤدي هذا التعليق إلى إيقاف تحذيرات البرمجيات في الفصل أو مستوى الطريقة. في بعض الأحيان ، تعرف بشكل أكثر وضوحًا من المترجم أن الكود يجب أن يستخدم طريقة مرفوضة أو تنفيذ بعض الإجراءات التي لا يمكن أن تحدد بشكل ثابت ما إذا كان النوع الآمن آمنًا ، واستخدامه:
suppressWarnings ("deprecation") public static void selfdestruct () {thread.currentThread (). stop () ؛}ربما يكون هذا هو الشيء الأكثر فائدة في التعليقات التوضيحية المدمجة. لسوء الحظ ، لا يدعم Javac لـ 1.5.0_04. لكن 1.6 يدعمها ، وتشمل Sun على نقلها للخلف إلى 1.5.
يتم دعم هذا التعليق التوضيحي في Eclipse 3.1 ، وقد تدعمه IDEs الأخرى. يتيح لك هذا تحرير الكود تمامًا من التحذير. إذا كان هناك تحذير في وقت الترجمة ، فيمكنك التأكد من أنك أضفته للتو - للمساعدة في عرض الكود الذي قد يكون غير آمن. مع إضافة الأدوية الجيلية ، سيكون أكثر سهولة للاستخدام.
تم إهماله
لسوء الحظ ، انخفاضه ليس مفيدًا. كان المقصود في الأصل استبدال علامة javadoc @deprecated ، ولكن نظرًا لأنها لا تحتوي على أي حقول ، فلا توجد طريقة لاقتراح مستخدمي الفئات أو الأساليب التي يجب أن يستخدمها كبديل. معظم
يتطلب كل من الاستخدام علامة Javadoc وهذا التعليق التوضيحي.
تجاوز
يقول Override أن الطريقة التي تتراجع بها يجب أن تتجاوز الأساليب بنفس التوقيع في الطبقة الفائقة:
Overridepublic int hashcode () {...}بالنظر إلى المثال أعلاه ، إذا لم يتم رسملة "C" في Hashcode ، فلن تكون هناك أخطاء في وقت الترجمة ، ولكن لن يتم استدعاء الطريقة كما هو متوقع في وقت التشغيل. عن طريق إضافة علامة التجاوز ، سيطالب برنامج التحويل البرمجي إذا قام بالفعل بإعادة الكتابة.
هذا مفيد أيضًا في المواقف التي تتغير فيها فئات فائقة. إذا تمت إضافة معلمة جديدة إلى الطريقة ، وتم إعادة تسمية الطريقة نفسها ، فلن يتم تجميع الفئة الفرعية فجأة لأنها لم تعد تعيد كتابة أي شيء من الطبقة الفائقة.
ملاحظات أخرى
التعليقات مفيدة جدا في السيناريوهات الأخرى. عندما لا يكون تعديل السلوك بشكل مباشر ولكن يعزز السلوك ، خاصة عند إضافة رمز BoilerPlate ، يعمل التعليق التوضيحي جيدًا في الأطر مثل EJB وخدمات الويب.
لا يمكن استخدام التعليقات كمعالجات مسبقة. يمنع تصميم Sun على وجه التحديد تعديل رمز الفئة بالكامل بسبب التعليقات. يتيح لك ذلك فهم نتائج اللغة بشكل صحيح ، ويمكن للأدوات مثل IDE أيضًا إجراء تحليل وإعادة تدوين الكود المتعمق.
التعليق ليس رصاصة فضية. عندما واجهتها لأول مرة ، حاول الناس تجربة العديد من التقنيات. يرجى الاطلاع على الاقتراحات التالية التي تم الحصول عليها من الآخرين:
الفئة العامة foo {propertyprivate int bar ؛}تتمثل الفكرة في إنشاء أساليب Getter و Setter تلقائيًا لشريط الحقل الخاص. لسوء الحظ ، هناك إخفاقان في هذه الفكرة: 1) لا يعمل ، و 2) يجعل القراءة والمعالجة من الكود. من المستحيل تنفيذها ، لأنه كما ذكرنا سابقًا ، يمنع Sun على وجه التحديد تعديل الفصول مع التعليقات.
حتى لو كان ذلك ممكنًا ، فهذه ليست فكرة جيدة لأنها تجعل الكود قابلاً للقراءة بشكل سيئ. في المرة الأولى التي ترى فيها هذا الرمز ، لن تعرف أن التعليق يخلق الطريقة. أيضًا ، إذا كنت بحاجة إلى إجراء بعض العمليات داخل هذه الأساليب في المستقبل ، فإن التعليقات عديمة الفائدة. باختصار ، لا تحاول القيام بأشياء يمكن أن تفعلها الكود العادي بالتعليقات.
التعداد
يشبه Enum إلى حد كبير إعلان Int Static Final ، والذي تم استخدامه كقيمة تعداد لسنوات عديدة. إن التحسن الأكبر والأكثر وضوحًا لـ Int هو سلامة النوع - لا يمكنك استبدال نوع آخر عن طريق الخطأ بنوع واحد من التعداد ، وهو ما يختلف عن INT ، وجميع ints هي نفسها بالنسبة للمترجم. مع استثناءات قليلة جدًا ، يجب عادةً استبدال جميع هياكل int على غرار التعداد بحالات التعداد.
يوفر التعداد بعض الميزات الإضافية. الفئتان العمليتان enummap و enumset هما تطبيقات مجموعة قياسية تم تحسينها خصيصًا للتعداد. إذا كنت تعلم أن المجموعة تحتوي على أنواع التعداد فقط ، فيجب عليك استخدام هذه المجموعات الخاصة بدلاً من HashMap أو Hashset.
في معظم الحالات ، يمكنك استخدام ENUM لاستبدال جميع ints النهائي الثابت في الكود. فهي قابلة للمقارنة ويمكن استيرادها بشكل ثابت ، لذلك يبدو أن الإشارات إليها معادلة ، حتى بالنسبة للصفوف الداخلية (أو أنواع التعداد الداخلي). لاحظ أنه عند مقارنة أنواع التعداد ، تشير التعليمات التي تعلن عن قيمها المتسلسلة.
طريقة ثابتة "مخفية"
تظهر طريقتان ثابتتان في جميع إعلانات نوع التعداد. نظرًا لأنها طرق ثابتة في الفئات الفرعية التعداد ، وليس طرق التعداد نفسها ، فإنها لا تظهر في Javadoc of Java.lang.enum.
الأول هو القيم () ، التي تُرجع مجموعة من جميع القيم الممكنة لنوع التعداد.
والثاني هو valueof () ، الذي يعيد نوع التعداد للسلسلة المقدمة ، والتي يجب أن تطابق بالضبط إعلان رمز المصدر.
طريقة
أحد الجوانب المفضلة لدينا حول أنواع التعداد هو أنه يمكن أن يكون له طرق. في الماضي ، قد تضطر إلى كتابة بعض التعليمات البرمجية لتحويلها النهائي الثابت العام وتحويله من نوع قاعدة البيانات إلى عنوان URL JDBC. الآن ، يمكن صنع نوع التعداد نفسه بكامل
طرق لمعالجة الكود. فيما يلي مثال ، بما في ذلك الطريقة المجردة لنوع التعداد databaseType والتنفيذ المقدم في كل مثيل ENUM:
databaseType {Oracle {{public string getjdbcurl () {...}} ، mysql {public string getjdbcurl () {...}} ؛ سلسلة ملخصية عامة getjdbcurl () ؛}الآن يمكن أن يوفر نوع التعداد طرقه العملية مباشرة. على سبيل المثال:
databasetype dbtype = ... ؛ String jdbcurl = dbtype.getjdbcurl () ؛
للحصول على عنوان URL ، يجب أن تعرف مسبقًا حيث توجد طريقة الأداة المساعدة.
فارارج
استخدام المعلمات القابلة للتغيير بشكل صحيح لا تنظيف بعض التعليمات البرمجية غير المرغوب فيها. مثال نموذجي هو طريقة سجل مع عدد متغير من معلمات السلسلة:
log.log (رمز السلسلة) log.log (رمز السلسلة ، سلسلة arg) log.log (رمز السلسلة ، سلسلة arg1 ، سلسلة arg2) log.log (رمز السلسلة ، سلسلة [] args)
عند مناقشة المعلمات المتغيرة ، من المثير للاهتمام أنه إذا استبدلت الأمثلة الأربعة الأولى بمعلمات متغيرة جديدة ، فسيكون ذلك متوافقًا:
انسخ الرمز كما يلي: log.log (رمز السلسلة ، السلسلة ... args)
جميع المعلمات القابلة للتغيير متوافقة مع المصدر - أي إذا تم إعادة ترجمة جميع برامج الاتصال الخاصة بـ LOG () ، يمكن استبدال جميع الطرق الأربعة مباشرة. ومع ذلك ، إذا كان التوافق الثنائي المتخلف مطلوبًا ، فيجب التخلي عن الطرق الثلاثة الأولى. الطريقة الأخيرة فقط مع معلمة صفيف السلسلة تعادل إصدار variadic ، بحيث يمكن استبدالها بإصدار variadic.
اكتب يلقي
إذا كنت تريد أن يعرف المتصل أي نوع من المعلمات يجب استخدامه ، فيجب عليك تجنب الكتابة مع المعلمات القابلة للتغيير. بالنظر إلى المثال التالي ، الأمل الأول هو سلسلة ، والأمل الثاني هو الاستثناء:
log.log (Object ... Objects) {string message = (string) Objects [0] يجب أن يكون توقيع الطريقة على النحو التالي ، ويتم الإعلان عن المعلمات القابلة للتغيير المقابلة باستخدام السلسلة والاستثناء على التوالي:
نسخة الكود كما يلي: log.log (رسالة سلسلة ، استثناء E ، كائن ... كائنات) {...}
لا تستخدم المعلمات المتغيرة لتدمير نظام النوع. لا يمكن استخدامه إلا عند كتابته بقوة. بالنسبة لهذه القاعدة ، يعد printstream.printf () استثناءً مثيرًا للاهتمام: إنه يوفر معلومات النوع كوسيطة الأولى بحيث يمكن قبول هذه الأنواع لاحقًا.
عودة التباين
يتمثل الاستخدام الأساسي للعودة المتغيرة في تجنب النوع عندما يكون نوع الإرجاع للتنفيذ أكثر تحديداً من واجهة برمجة التطبيقات. في المثال التالي ، هناك واجهة حديقة للحيوانات تُرجع كائن حيوان. يقوم تنفيذنا بإرجاع كائن AnimalImpl ، ولكن قبل JDK 1.5 ، يجب إعلان إعادة كائن حيوان. :
Zoo Zoo {public Animal Getanimal () ؛} Zooimpl من الفئة العامة تنفذ Zoo {public Animal getanimal () {return new AnimalImpl () ؛}}يستبدل استخدام العوائد المتغيرات ثلاثة نماذج:
الوصول المباشر إلى الميدان. للتحايل على قيود API ، تعرض بعض التطبيقات الفئات الفرعية مباشرة في الحقول:
انسخ الرمز كما يلي: zooimpl._animal
نموذج آخر هو إجراء تحويل لأسفل في برنامج الاتصال ، مع العلم أن التنفيذ هو في الواقع فئة فرعية محددة:
نسخة الكود كما يلي: ((animalimpl) zooimpl.getanimal ()). Implmethod () ؛
النموذج الأخير الذي رأيته هو طريقة ملموسة تستخدم لتجنب المشكلات الناجمة عن توقيع مختلف تمامًا:
نسخة الكود كما يلي: zooimpl._getanimal () ؛
هذه الأوضاع الثلاثة لها مشاكل وقيودها. إما أنه ليس أنيقًا بدرجة كافية أو يعرض تفاصيل التنفيذ غير الضرورية.
التباين
وضع الإرجاع المتغير هو أنظف وأكثر أمانًا وسهل الصيانة ، ولا يتطلب نوعًا من النوع أو الأساليب أو الحقول المحددة:
Public AnimalImpl getAnimal () {return new AnimalImpl () ؛ } استخدم النتائج:
نسخة الكود كما يلي: zooimpl.getAnimal (). Implmethod () ؛
باستخدام الأدوية الجيلية
سوف نتعرف على الأدوية الجيلية من منظورين: استخدام الأدوية الجينية وبناء الأدوية الجيلية. نحن لا نناقش الاستخدام الواضح للقائمة والتعيين والخريطة. يكفي معرفة أن المجموعات العامة قوية ويجب استخدامها بشكل متكرر.
سنناقش استخدام الأساليب العامة وطريقة التحويل البرمجي لاستنتاج الأنواع. عادةً ما لا يحدث أي من هذه الأشياء ، ولكن عندما يحدث خطأ ما ، يمكن أن تكون رسالة الخطأ مربكة للغاية ، لذلك تحتاج إلى معرفة كيفية إصلاح هذه المشكلات.
طرق عامة
بالإضافة إلى الأنواع العامة ، تقدم Java 5 أيضًا طرقًا عامة. في هذا المثال من java.util.collections ، يتم إنشاء قائمة عنصر واحد. يتم استنتاج نوع عنصر القائمة الجديدة بناءً على نوع الكائن الذي تم تمريره بالطريقة:
انسخ الرمز على النحو التالي: قائمة ثابتة <T> <T> Collections.SingleTonList (T O)
مثال الاستخدام:
القائمة العامة <integer> getListoFone () {Return Collections.SingleTonList (1) ؛}في مثال الاستخدام ، نمر في int. لذا فإن نوع الإرجاع للطريقة هو القائمة <integer>. المترجم يثبت t إلى عدد صحيح. هذا يختلف عن الأنواع العامة ، لأنك لا تحتاج عادة إلى تحديد معلمات النوع بشكل صريح.
هذا يوضح أيضا التفاعل بين autoboxing والكمال الأدوار. يجب أن تكون المعلمة النوع هي نوع مرجع: لهذا السبب نحصل على قائمة <integer> بدلاً من القائمة <int>.
طرق عامة بدون معلمات
يتم تقديم طريقة FrankList () مع الأدوية الجيرية باعتبارها تقليبًا آمنًا للحقل الفارغ في java.util.collections:
انسخ الرمز على النحو التالي: قائمة ثابتة <T> <T> collections.emptylist ()
مثال الاستخدام:
القائمة العامة <integer> getNointegers () {return collections.emptylist () ؛}على عكس المثال السابق ، لا تحتوي هذه الطريقة على معلمات ، فكيف يستنتج المترجم نوع T؟ في الأساس ، سيحاول استخدام المعلمة مرة واحدة. إذا لم ينجح ، فإنه يحاول استخدام نوع الإرجاع أو المهمة مرة أخرى. في هذا المثال ، تكون القائمة هي القائمة <integer> ، لذلك يتم استنتاج T كـ INTEGER.
ماذا يحدث إذا تم استدعاء طريقة عامة خارج بيان الإرجاع أو بيان المهمة؟ بعد ذلك ، لن يتمكن المترجم من إجراء النقل الثاني للاستدلال على النوع. في المثال التالي ، يتم استدعاء FrankList () من داخل المشغل الشرطي:
القائمة العامة <integer> getNointegers () {return x؟ collections.emptylist (): null ؛} نظرًا لأن المترجم لا يمكنه رؤية سياق الإرجاع ولا يمكن أن يستنتج T ، فإنه يتخلى ويأخذ الكائن. سترى رسالة خطأ مثل: "لا يمكن تحويل القائمة <Object> إلى القائمة <integer>."
لإصلاح هذا الخطأ ، يجب تمرير المعلمات اكتب بشكل صريح إلى استدعاء الطريقة. وبهذه الطريقة ، لن يحاول المترجم استنتاج معلمات النوع ويمكنه الحصول على النتيجة الصحيحة:
نسخة الكود كما يلي: إرجاع x؟ مجموعات.
مكان آخر يحدث فيه هذا غالبًا ما يكون في مكالمات الطريقة. إذا أخذت الطريقة قائمة <Tring> معلمة وتحتاج إلى استدعاء القائمة الفارغة () التي تم تمريرها لتلك المعلمة ، فإن هذا الجملة مطلوب أيضًا.
خارج المجموعة
فيما يلي ثلاثة أمثلة على الأنواع العامة ، والتي ليست مجموعات ، ولكن استخدام الأدوية الجيرية بطريقة جديدة. جميع الأمثلة الثلاثة تأتي من مكتبات جافا القياسية:
انسخ الرمز على النحو التالي: الفئة <T>
يتم تحديد الفئة على نوع الفصل. هذا يجعل من الممكن بناء newInstance بدون صب النوع.
انسخ الرمز كما يلي: قابلة للمقارنة <T>
قابلة للمقارنة معلمة بواسطة نوع المقارنة الفعلي. هذا يوفر كتابة أقوى عند مقارنته () المكالمات. على سبيل المثال ، تقوم السلسلة بتنفيذ <STRING>. استدعاء المقارنة () على أي شيء آخر غير السلسلة سوف تفشل في وقت الترجمة.
انسخ الرمز كما يلي: enum <e يمتد التعداد <e >>
يتم تحديد التعداد بواسطة نوع التعداد. سوف يمتد نوع التعداد المسماة اللون التعداد <LOOT>. تقوم طريقة getDeclaringClass () بإرجاع كائن فئة نوع التعداد ، في هذا المثال ، كائن ملون. إنه مختلف عن getClass () ، والذي قد يعيد فئة بدون اسم.
البرية
الجزء الأكثر تعقيدًا من الأدوية هو فهم شخصيات البدل. سنناقش ثلاثة أنواع من البطاقات البرية واستخداماتها.
أولاً ، دعونا نفهم كيف تعمل المصفوفات. يمكنك تعيين قيمة من عدد صحيح [] إلى رقم []. إذا حاولت كتابة تعويم إلى الرقم [] ، فيمكن تجميعه ، ولكنه سيفشل في وقت التشغيل ويظهر ArrayStoreException:
عدد صحيح [] ia = عدد صحيح جديد [5] ؛ رقم [] na = ia ؛ na [0] = 0.5 ؛ // تجميع ، لكنه يفشل في وقت التشغيل
إذا حاولت تحويل المثال مباشرة إلى عام ، فسوف يفشل في وقت الترجمة لأن المهمة غير مسموح بها:
قائمة <integer> ilist = new ArrayList <integer> () ؛ قائمة <number> nlist = ilist ؛ // غير المسموح بها. add (0.5) ؛
إذا كنت تستخدم Generics ، فلن تواجه عملية تشغيل ClassCastException طالما لا يظهر الرمز عند التجميع.
الحد العلوي البرية
ما نريده هو قائمة بنوع العنصر الدقيق غير معروف ، وهو مختلف عن المصفوفات.
القائمة <morm> هي قائمة نوع العنصر هي رقم النوع المحدد.
قائمة <؟ يمتد الرقم> هي قائمة بنوع العنصر الدقيق غير معروف. إنه رقم أو نوع فرعي.
الحد الأعلى
إذا قمنا بتحديث المثال الأولي وقمنا بتعيين القيمة لإدراج <؟ يمتد الرقم> ، ثم ستكون المهمة ناجحة الآن:
قائمة <integer> ilist = new ArrayList <integer> () ؛ قائمة <؟ يمتد الرقم> nlist = ilist ؛ الرقم n = nlist.get (0) ؛ nlist.add (0.5) ؛ // غير مسموح به
يمكننا الحصول على الرقم من القائمة لأنه يمكننا تعيينه إلى الرقم بغض النظر عن نوع العنصر الدقيق للقائمة (العائمة أو عدد صحيح أو رقم).
ما زلنا لا نستطيع إدراج أنواع النقاط العائمة في القائمة. سوف يفشل هذا في وقت التجميع لأننا لا نستطيع إثبات أن هذا آمن. إذا أردنا إضافة أنواع نقاط عائمة إلى القائمة ، فسوف يكسر سلامة النوع الأولي لـ IList - فهو يخزن فقط عدد صحيح.
تمنحنا البطاقات البرية قوة تعبيرية أكثر من المصفوفات.
لماذا تستخدم البطاقات البرية
في المثال التالي ، تُستخدم الأرقام البرية لإخفاء معلومات النوع من مستخدمي واجهة برمجة التطبيقات. داخليًا ، يتم تخزين المجموعة كعميل. يعرف مستخدمو API فقط أنهم يحصلون على مجموعة يمكنهم من خلالها قراءة العميل.
مطلوب أحرف البرية هنا لأنه من المستحيل تعيين قيم لتعيين <Customer> من SET <CustomerImpl>:
ClientFactory public {private set <CustomerImpl> _customers ؛ مجموعة عامة <؟ يمتد العميل> getCustomers () {return _customers ؛}}Wildcard والعودة المتغيرة
الاستخدام الشائع الآخر لشخصيات البطاقة البرية هو استخدامه مع عودة المتغير. يمكن تطبيق نفس قواعد المهمة على العوائد المتغيرة. إذا كنت ترغب في إرجاع نوع عام أكثر تحديدًا في طريقة إعادة كتابتها ، فيجب أن تستخدم الطريقة المعلنة بطاقة Wildcard:
الواجهة العامة NumberGenerator {قائمة عامة <؟ يمتد الرقم> إنشاء () ؛} الفئة العامة fibonaccigenerator يمتد الرقم generator {القائمة العامة <integer> إنشاء () {...}}إذا كنت ترغب في استخدام صفيف ، يمكن للواجهة إرجاع الرقم [] ، بينما يمكن للتنفيذ إرجاع عدد صحيح [].
الحد الأدنى
ما نتحدث عنه هو بشكل أساسي حول الحد الأعلى للبرية. هناك أيضا الحد الأدنى البرية. قائمة <؟ Super Number> هي قائمة "نوع العنصر" الدقيق غير المعروف ، ولكن قد يكون mnumber ، أو supertype من الرقم. لذلك قد تكون قائمة <morm> أو قائمة <Object>.
تعتبر البطاقات البرية المحدودة أقل شيوعًا بكثير من البطاقات البرية المحدودة العليا ، لكنها مطلوبة عند الحاجة إليها.
الحد الأدنى والأعلى
قائمة <؟ يمتد الرقم> قائمة القراءة = جديد arraylist <integer> () ؛ الرقم n = readlist.get (0) ؛ قائمة <؟ Super Number> WriteList = new ArrayList <Object> () ؛ WriteList.add (عدد صحيح جديد (5)) ؛
الأول هو قائمة الأرقام التي يمكن قراءتها.
والثاني هو قائمة الأرقام التي يمكنك الكتابة إليها.
برية غير محدودة
أخيرًا ، يمكن أن يكون محتوى القائمة <؟> من أي نوع ، وهو نفس القائمة تقريبًا <؟ يمتد الكائن>. يمكن قراءة الكائنات في أي وقت ، ولكن لا يمكن كتابة المحتوى إلى القائمة.
أحرف البرية في واجهات برمجة التطبيقات العامة
باختصار ، كما ذكرنا سابقًا ، تعد الأرقام البرية مهمة للغاية في إخفاء تفاصيل التنفيذ من المتصل ، ولكن حتى لو كانت البطاقات البرية ذات الحدود السفلية توفر وصولًا للقراءة فقط ، فهي ليست هي الحالة بسبب الأساليب غير الجينية مثل الإزالة (الموضع int). إذا كنت تريد مجموعة غير متغيرة حقًا ، فيمكنك استخدام الطريقة على java.util.collection مثل unmodifiablelist ().
تذكر أحرف البدل عند كتابة واجهات برمجة التطبيقات. بشكل عام ، عند تمرير أنواع عامة ، يجب أن تحاول استخدام أحرف البدل. يمكّن المزيد من المتصلين من الوصول إلى واجهة برمجة التطبيقات.
من خلال استلام قائمة <؟ يمتد الرقم> بدلاً من القائمة <number> ، يمكن استدعاء الطريقة التالية من قبل العديد من الأنواع المختلفة من القوائم:
نسخة الكود كما يلي: void removenegative (قائمة <؟ تمديد الرقم> قائمة) ؛
بناء أنواع عامة
الآن سنناقش بناء أنواعنا العامة. سنعرض بعض الأمثلة التي يمكن تحسين فيها سلامة النوع باستخدام الأدوية الجينية ، وسنناقش أيضًا بعض المشكلات الشائعة عند تنفيذ الأنواع العامة.
وظائف تشبه المجموعة
المثال الأول للفئة العامة هو مثال على نمط التجميع. يحتوي الزوج على معلمتين من النوع ، والحقل هو مثيل من النوع:
زوج الفئة النهائية العامة <a ، b> {public final a first ؛ public final b second ؛ public pull (a first ، b second) {this.first = first ؛ this.second = second ؛}}هذا يجعل من الممكن إعادة عنصرين من طريقة دون كتابة فئة مخصصة لكل مجموعة من نوعين. هناك طريقة أخرى هي إرجاع الكائن [] ، وهو النوع غير آمن أو غير مرغوب فيه.
في الاستخدام التالي ، نرجع ملفًا وملحومًا من الطريقة. يمكن لعميل الطريقة استخدام الحقول مباشرة بدون صب النوع:
الزوج العام <file ، boolean> getFileAndWriteStatus (مسار السلسلة) {// إنشاء ملف و statusReTurn زوج جديد <file ، boolean> (الملف ، الحالة) ؛} الزوج <file ، boolean> result = getFileAndWritestatus ("...") ؛ file f = result.first ؛ Boolean crinsable = result.Second ؛خارج المجموعة
في المثال التالي ، يتم استخدام الأدوية الجيرية لأمن وقت الترجمة الإضافي. من خلال تحديد فئة DBFActory إلى نوع النظير الذي تم إنشاؤه ، فأنت في الواقع تجبر الفئة الفرعية للمصنع على إعادة نوع فرعي محدد من الأقران:
الفئة المجردة العامة dbfactory <t يمتد dbpeer> {محمي التجريد t createMePtyPeer () ؛ القائمة العامة <T> الحصول على (قيود السلسلة) {list <t>من خلال تنفيذ DBFActory <sutry> ، يجب على CustomerFactory إرجاع العميل من CreateMePtyPeer ():
يمتد CustomerFactory من الفئة العامة DBFActory <Pustomer> {العميل العام createMePtyPeer () {return new Customer () ؛}}طرق عامة
سواء كنت ترغب في فرض قيود على الأنواع العامة بين المعلمات وبين المعلمات وأنواع الإرجاع ، يمكنك استخدام طرق عامة:
على سبيل المثال ، إذا كانت وظيفة الانعكاس المكتوبة مقلوبة بشكل موضعي ، فقد لا تكون هناك حاجة إلى طريقة عامة. ومع ذلك ، إذا كنت ترغب في إرجاع الانعكاس إلى قائمة جديدة ، فقد ترغب في أن يكون نوع العنصر في القائمة الجديدة هو نفس نوع القائمة الواردة. في هذه الحالة ، هناك حاجة إلى طريقة عامة:
انسخ الرمز كما يلي: <T> قائمة <T> عكس (قائمة <T> قائمة)
أسمنت
عند تنفيذ فئة عامة ، قد ترغب في إنشاء صفيف t []. نظرًا لأن الأدوية الجيرية يتم تنفيذها عن طريق المحو ، فهذا غير مسموح به.
يمكنك محاولة صب كائن [] إلى t []. لكن هذا غير آمن.
حلول ملموسة
وفقًا لاتفاقية البرامج التعليمية العامة ، يستخدم الحل "Type Token". عن طريق إضافة معلمة <T> فئة إلى المنشئ ، يمكنك إجبار العميل على توفير كائن الفئة الصحيح لمعلمات نوع الفئة:
ArrayExample exexample <t> {private class <T> clazz ؛ public arrayexample (class <T> clazz) {this.clazz = clazz ؛} public t [] getarray (int size) {return (t []) array.newinstance (clazz ، size) ؛}}من أجل إنشاء ArrayExample <string> ، يجب على العميل تمرير String.class إلى المُنشئ لأن نوع String.Class هو الفئة <String>.
إن وجود كائن فئة يجعل من الممكن إنشاء مجموعة من نوع العناصر الصحيح
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.