سؤال

أنا فقط تعلمت كيف جافا تنفذ هياكل البيانات في القوائم المرتبطة.من ما أفهم ، Iterators هي وسيلة من العبور من خلال العناصر في بنية البيانات مثل قائمة.لماذا هذا واجهة المستخدم ؟ لماذا هي طرق hasNext(), next() و remove() لا مباشرة ترميز البيانات هيكل تنفيذ نفسه ؟

من جافا الموقع: وصلة النص

واجهة عامة مكرر<E>

وهو مكرر أكثر من مجموعة.مكرر يأخذ مكان التعداد في جافا.التكرار تختلف من التعدادات بطريقتين:

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

حاولت البحث في قوقل حول و لا يمكن أن يبدو للعثور على إجابة محددة.شخص ما يمكن أن يلقي بعض الضوء على السبب الشمس اختار استخدامها ؟ هل لأنه من أفضل التصميم ؟ زيادة الأمن ؟ جيد OO الممارسة ؟

أي مساعدة سوف يكون موضع تقدير كبير.شكرا

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

المحلول

لماذا هذا واجهة المستخدم ؟

لأنه يدعم العمليات الأساسية التي من شأنها أن تسمح عميل مبرمج تكرار أكثر من أي نوع من جمع (ملاحظة:ليس بالضرورة Collection في Object إحساس).

لماذا هي طرق...لا مباشرة ترميز البيانات هيكل تنفيذ نفسه ؟

كانوا هم مجرد وضع علامة خاص بحيث لا يمكن الوصول إليها و الوحل معهم.وبشكل أكثر تحديدا:

  • يمكنك تنفيذ أو فرعية وهي Iterator مثل أن يفعل شيئا معيار منها لا تفعل ، دون الحاجة إلى تغيير الكائن الفعلي فيتم تكرار النظر.
  • الكائنات التي يمكن أن اجتاز أكثر لا تحتاج إلى واجهات بهم تشوش مع اجتياز الطرق على وجه الخصوص أي متخصصة الأساليب.
  • يمكنك من جهة Iterators إلى ذلك العديد من العملاء يحلو لك, و كل عميل قد تعبر في الوقت الخاصة بهم في سرعة الخاصة بهم.
  • جافا Iterators من جافا.util حزمة خاصة رمي استثناء إذا كان التخزين التي ظهر عليها تعديل في حين لا يزال لديك Iterator للخروج.هذا استثناء يتيح لك معرفة أن Iterator قد تكون العودة غير صالحة الكائنات.

عن برامج بسيطة, لا شيء من هذا يبدو جديرا بالاهتمام.نوع من التعقيد الذي يجعلها مفيدة سوف يأتي عليك بسرعة, على الرغم من.

نصائح أخرى

تسأل:"لماذا هي طرق hasNext () ، () وإزالة() لا مباشرة ترميز البيانات هيكل تنفيذ نفسه؟".

في جافا اختار تعريف مكرر واجهة تخريجها إلى المجموعة نفسها.عادة, لأن كل جمع جافا تنفذ Iterable واجهة برنامج Java سيتم استدعاء iterator لخلق الخاصة بها التكرار بحيث يمكن استخدامها في حلقة.كما أشار آخرون ، جافا 5 يسمح لنا أن الاستخدام المباشر من التكرار ، مع ل-كل حلقة.

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

في الكلاسيكية GoF الكتاب التباين بين الداخلية والخارجية التكرار هو المنصوص عليها بوضوح تام.

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

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

للحصول على مثال عن كيفية الداخلية التكرار العمل ، انظر روبي Enumerable API, والتي الداخلية التكرار أساليب مثل each.في روبي ، الفكرة هي أن تمر كتلة من التعليمات البرمجية (أيالإغلاق) داخلي مكرر بحيث مجموعة يمكن أن تأخذ الرعاية من تلقاء نفسها التكرار.

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

أسفل الجانب من هذا الانفصال هو أن التكرار لا يعلم أن التغييرات التي أدخلت على جمع ذلك تتكرر على.لذلك لا يمكنك تغيير مجموعة هيكل نتوقع مكرر على مواصلة ذلك العمل دون "الشكاوى".

باستخدام Iterator واجهة يسمح لأي فئة التي تطبق أساليب بمثابة التكرار.مفهوم واجهة في جاوة هو أن يكون بطريقة تعاقدية ملزمة بتوفير وظائف معينة في فئة implements واجهة للعمل في الطريقة التي مطلوب من قبل واجهة.منذ الالتزامات التعاقدية يجب أن تتحقق من أجل أن تكون صالحة فئة فئات أخرى التي ترى فئة implements واجهة وبالتالي يطمئن أن نعرف أن الطبقة أولئك وظائف معينة.

في هذا المثال, بدلا من تنفيذ طرق (hasNext(), next(), remove()) في LinkedList الطبقة نفسها ، LinkedList الفئة سوف تعلن أنها implements على Iterator واجهة ، حتى أن الآخرين يعرفون أن LinkedList يمكن أن تستخدم مكرر.في المقابل ، LinkedList الطبقة تنفيذ الطرق من Iterator واجهة (مثل hasNext()) ، لذلك يمكن أن تعمل مثل مكرر.

وبعبارة أخرى, تنفيذ واجهة هو وجوه المنحى البرمجة فكرة أن تدع الآخرين يعرفون أن فئة معينة لديها ما يلزم أن يكون ما يدعي أن يكون.

هذه الفكرة القسري من خلال وجود الأساليب التي يجب أن تنفذ من قبل الفئة التي تطبق الواجهة.وهذا يجعل التأكد من أن الفئات الأخرى التي ترغب في استخدام الفئة التي تطبق Iterator واجهة أنه سوف يكون في الواقع أساليب التكرار ينبغي أن يكون مثل hasNext().

كما تجدر الإشارة إلى أنه منذ جافا لا يكون وراثة متعددة ، استخدام واجهة يمكن استخدامها لمحاكاة تلك الميزة.من خلال تنفيذ واجهات متعددة ، يمكن للمرء أن يكون فئة فرعية وراثة بعض الميزات ، ولكن أيضا "يرث" ملامح أخرى من خلال تنفيذ واجهة.مثال ، إذا أردت أن يكون فرعية من LinkedList فئة تسمى ReversibleLinkedList والتي يمكن أن تكرر في ترتيب عكسي ، قد خلق واجهة تسمى ReverseIterator وعلى فرض أن توفر previous() الأسلوب.منذ LinkedList ينفذ بالفعل Iterator, الجديد عكسها قائمة نفذت كل Iterator و ReverseIterator الواجهات.

يمكنك قراءة المزيد حول واجهات من ما هو الواجهة ؟ من جافا التعليمي من الشمس.

مثيلات متعددة من interator يمكن استخدامها في وقت واحد.الاقتراب منهم المحلية المؤشرات البيانات الأساسية.

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

ابحث عن التكرار نمط تصميم ، و هنا: http://en.wikipedia.org/wiki/Iterator

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

أعتقد أنها جزء أساسي من جيدة التصميم MVC.البيانات من النموذج (أيهيكل البيانات) إلى عرض بطريقة أو بأخرى.استخدام مكرر كوسيط بين يضمن تنفيذ نموذج يتعرض أبدا.هل يمكن أن يكون الحفاظ على LinkedList في الذاكرة ، سحب المعلومات من خوارزمية فك التشفير أو التفاف JDBC المكالمات.لا يهم الرأي لأن الرأي فقط يهتم مكرر واجهة.

ورقة مثيرة للاهتمام مناقشة برو ويخدع استخدام التكرار:

http://www.sei.cmu.edu/pacc/CBSE5/Sridhar-cbse5-final.pdf

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

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

في نهاية المطاف, لأن التكرار يلتقط السيطرة على التجريد التي تنطبق على عدد كبير من هياكل البيانات.إذا كنت على نظرية فئة فو, هل يمكن أن يكون العقل في مهب هذه الورقة: جوهر نمط مكرر.

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

مكرر ببساطة يضيف وسيلة مشتركة من الذهاب أكثر من مجموعة من العناصر.واحدة من الميزات لطيفة هو أنا.إزالة() التي يمكنك إزالة العناصر من القائمة التي كنت بالتكرار أكثر.إذا حاولت إزالة العناصر من قائمة عادة سيكون لها آثار غريبة أو رمي استثناء.

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

التكرار هي واحدة من العديد من أنماط التصميم المتاحة في جاوة.تصميم أنماط يمكن أن تكون من حيث الفكر مريحة بناء كتل أنماط استخدام التعليمات البرمجية الخاصة بك/هيكل.

لقراءة المزيد عن التكرار تصميم نمط تحقق من هذا الموقع الذي يتحدث عن التكرار فضلا عن العديد من أنماط التصميم الأخرى.هنا مقتطف من الموقع على التكرار: http://www.patterndepot.com/put/8/Behavioral.html

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

التكرار يمكن استخدامها ضد أي نوع من جمع.أنها تسمح لك لتحديد خوارزمية ضد مجموعة من العناصر بصرف النظر عن التنفيذ.هذا يعني أنك يمكن أن عملية قائمة, مجموعة, سلسلة, ملفات, مجموعة, الخ.

بعد عشر سنوات من الآن يمكنك تغيير قائمة التنفيذ إلى أفضل تنفيذ الخوارزمية سوف لا تزال تعمل بسلاسة ضدها.

التكرار مفيد عندما كنت تتعامل مع مجموعات في جاوة.

استخدام من أجل كل حلقة(Java1.5) بالتكرار على مجموعة أو مجموعة أو قائمة.

جافا.util.مكرر واجهة المستخدم في جافا يسمح تعديل جمع في حين لا يزال بالتكرار من خلال ذلك.إذا كنت ترغب فقط نظيفة تكرار عبر مجموعة كاملة ، واستخدام أ-لكل بدلا من ذلك ، ولكن رأسا على عقب من التكرار هو الوظيفة التي يمكنك الحصول على:اختياري إزالة() عملية ، وحتى أفضل قائمة مكرر واجهة ، والتي تقدم إضافة() وتعيين() العمليات أيضا.كل من هذه واجهات تسمح لك أن تكرار عبر مجموعة و تغيير هيكلي في نفس الوقت.محاولة تعديل مجموعة في حين بالتكرار من خلال ذلك مع مقابل كل رمي ConcurrentModificationException عادة لأن المجموعة بشكل غير متوقع تعديل!

نلقي نظرة على ArrayList الدرجة

لديها 2 فصول خاصة داخل (الطبقات الداخلية) ودعا Itr و ListItr

تنفيذ التكرار و ListIterator واجهات على التوالي

الطبقة العامة ArrayList.....{ //أرفق الدرجة

  private class Itr implements Iterator<E> {

        public E next() {
            return ArrayList.this.get(index++); //rough, not exact
        }

        //we have to use ArrayList.this.get() so the compiler will
        //know that we are referring to the methods in the 
        //enclosing ArrayList class

        public void remove() {
            ArrayList.this.remove(prevIndex);
        }

        //checks for...co mod of the list
        final void checkForComodification() {  //ListItr gets this method as well
             if (ArrayList.this.modCount != expectedModCount) { 
                 throw new ConcurrentModificationException();
             }
        }
  }

  private class ListItr extends Itr implements ListIterator<E> {
         //methods inherted....
        public void add(E e) {
            ArrayList.this.add(cursor, e);
        }

        public void set(E e) {
            ArrayList.this.set(cursor, e);
        }
  }

}

عند استدعاء أساليب التكرار() و listIterator () ، يعودون مثيل جديد من فئة Itr أو ListItr ، لأن هذه الطبقات الداخلية هي "داخل" أرفق ArrayList فئة بحرية تعديل ArrayList دون إحداث ConcurrentModificationException, إلا إذا قمت بتغيير قائمة في نفس الوقت (conccurently) من خلال مجموعة() add() أو إزالة() أساليب ArrayList الدرجة.

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