জাভার ইটারেটর এবং লিস্টিলেটর উপাদানগুলির মধ্যে কেন পয়েন্ট করবে?


9

ListIterator জন্য Javadoc বলেছেন:

ListIteratorএর বর্তমান উপাদান নেই; তার কার্সার অবস্থানে সবসময় উপাদান যে একটি কল দ্বারা ফিরে যাবে মধ্যবর্তী previous()এবং উপাদান যে একটি কল দ্বারা ফিরে যাবে next()

জাভা কেন ListIteratorবর্তমান উপাদানগুলির চেয়ে উপাদানগুলির মধ্যে নির্দেশ করতে প্রয়োগ করা হয়েছিল ? মনে হচ্ছে যে এই ক্লায়েন্ট কোড কম পাঠযোগ্য যখন এটি বারবার কল করতে হয়েছে getNext(), getPrevious()তাই আমি অনুমান পছন্দ জন্য একটি ভাল কারণ সেখানে থাকতে হবে।

একটি সাইড নোট হিসাবে, আমি শুধু লিখেছিলেন একটু গ্রন্থাগার নামক peekable-arraylist যে প্রসারিত করে ArrayList, Iteratorএবং ListIteratorযে একটি উপলব্ধ peekAtNext()এবং peekAtPrevious()পদ্ধতি মত বাস্তবায়িত:

  @Override public synchronized T peekAtNext() {
     T t = next();
     previous();
     return t;
  }

2
পেয়ারা লাইব্রেরি কোড জিমেইল.com
কেভিন

ধন্যবাদ কেভিন! আমি এসও-তে এর একটি ফলো-আপ প্রশ্ন পোস্ট করেছি: পেয়াকিংয়ের সাথে পেয়ারার ফরোয়ার্ডলিস্টলিস্টের ব্যবহার করা কি সম্ভব?
glenviewjeff

উত্তর:


12

আমি যতদূর বলতে পারি, কারণটি জাভাডোকের অংশে পাওয়া যাবে যা আপনি উদ্ধৃত করেন নি (আমার নীচে জোর দেওয়া):

তালিকাগুলির জন্য একটি পুনরাবৃত্তি যা প্রোগ্রামারকে উভয় দিক দিয়ে তালিকাটিকে অতিক্রম করতে দেয়, পুনরাবৃত্তির সময় তালিকাকে সংশোধন করে ...

আপনি দেখুন, উদ্দেশ্যটি হ'ল তালিকাটি সংশোধন করার সময় ব্যবহারের অনুমতি দেওয়া। সম্ভাব্য সংশোধনগুলির মধ্যে দৃশ্যত উপাদানগুলির অপসারণ অন্তর্ভুক্ত রয়েছে ।

এখন চিন্তা করুন যে আমরা যদি current()পুনরুক্তিকারীদের জন্য থাকা কোনও উপাদানটি সরিয়ে ফেলি - তাহলে এই উপাদানটি ধরে নেওয়া হবে যে বর্তমান উপাদানটির একটি ধারণা থাকবে? এই প্রসঙ্গে, বর্তমান উপাদানটির ধারণা না থাকলে এটিকে বাস্তবায়নের উপায়টি আমার কাছে বেশ ভাল ধারণা তৈরি করে - কারণ এইভাবে পুনরাবৃত্তকারীকে উপাদান অপসারণের বিষয়ে চিন্তা করতে হবে না।


এটা খেয়াল করা জরুরী যে জাভাডোকের থ্রেড সুরক্ষিত হওয়ার জন্য ইন্টারফেস বাস্তবায়ন প্রয়োজন হয় না।

  • কারণ যে, এক সঠিক হ্যান্ডলিং আশা করা উচিত নয় পরিবর্তন বিভিন্ন থ্রেড থেকে করা - যে জন্য, বাস্তবায়নের যেমন প্রতি জাভা মেমরি মডেল দ্বারা নির্দিষ্ট সিংক্রোনাইজ অ্যাক্সেস, গ্যারান্টি দৃশ্যমানতা ইত্যাদি অতিরিক্ত উপায় প্রদান করতে হবে JSR 133

লিস্টিএইটরেটার কী সক্ষম, পুনরাবৃত্তির সময় একই থ্রেড থেকে সম্পাদিত পরিবর্তনগুলি পরিচালনা করছে। সমস্ত পুনরুক্তিকারী এর মতো হয় না, সমকালীন মডেলিংএক্সেপশন জাভাদোকগুলি বিশেষত এ সম্পর্কে সতর্ক করে দেয়:

... নোট করুন যে এই ব্যতিক্রমটি সর্বদা ইঙ্গিত দেয় না যে কোনও বস্তু একই সময়ে ভিন্ন থ্রেড দ্বারা সংশোধন করা হয়েছে। যদি একটি একক থ্রেড কোনও পদ্ধতির অনুরোধগুলির একটি ক্রম জারি করে যা কোনও সামগ্রীর চুক্তি লঙ্ঘন করে তবে অবজেক্টটি এই ব্যতিক্রমটিকে ছুঁড়ে ফেলতে পারে। উদাহরণস্বরূপ, যদি কোনও থ্রেড একটি ব্যর্থ-দ্রুত পুনরুক্তি দিয়ে সংগ্রহের উপর পুনরাবৃত্তি করার সময় কোনও সংগ্রহ সরাসরি সংশোধন করে তবে পুনরুক্তি এই ব্যতিক্রমটিকে নিক্ষেপ করবে ...


1
এর অর্থ এটিও হ'ল আপনার আলাদা প্রয়োজন হবে না insertBeforeএবং insertAfterযদিও এটি কোনও হিসাবে বড় সমস্যা নয় remove
কার্ল বিলেফেল্ট

1
সুতরাং যে সমস্যাটি একই সাথে বর্তমান উপাদানটিকে সরিয়ে এবং অ্যাক্সেস করতে পারে? একসাথে কল হিসাবে এটি কি সমতুল্য সমস্যা হবে না next()? remove()হবে synchronizedকরবে getCurrent()। আমি কিছু অনুপস্থিত করছি?
glenviewjeff

@glenviewjeff এটি একটি খুব ভাল পর্যবেক্ষণ। আমি আরও আশ্চর্য হই যে কীভাবে সিএমই সেখানে পরিচালনা করা যায় - পরিবর্তনের অনুমতি দেওয়ার খুব বিবৃত উদ্দেশ্য সেই জাতীয় উদ্বেগ উত্থাপন করে। অনুমান করি আমাকে আরও গভীর খনন করা দরকার। আমি 99.99% নিশ্চিত যে এটি থ্রেড নিরাপদ হিসাবে নয়, সম্ভবত এটি একই থ্রেড থেকে সম্পন্ন সাম্প্রতিক মোডগুলি পরিচালনা করতে পারে (সমস্ত পুনরাবৃত্তি এটি সক্ষম নয়, আপনি জানেন)
জিনাত

আপনি যদি আগ্রহী হন তবে আমার সম্পাদনা দেখুন। এটি বাস্তবায়নের জন্য আমি একটি এক্সটেনশন প্রয়োগ করেছি এবং প্যাকেজ করেছি ArrayList
glenviewjeff

পছন্দ করুন আপনার প্রয়োগে, পরবর্তী () এবং পূর্ববর্তী ()গুলিও সিঙ্ক হয়? আমি জিজ্ঞাসা করি কারণ যদি তা না হয় তবে অন্য থ্রেডটি আপনার বর্তমান () এর মাঝখানে কিছু অপ্রত্যাশিত পদক্ষেপ ডান "ড্রিল" করতে পারে, এটি ক্লায়েন্টের মতো প্রত্যাশা মতো আচরণ করে না ... অ্যাড () যুক্ত করার পদ্ধতিগুলিতে সম্ভবত সিঙ্কেরও প্রয়োজন হবে
gnat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.