জাভার অ্যাবস্ট্রাকলিস্টের অপসারণের ব্যবস্থা () পদ্ধতিটি সুরক্ষিত কেন?


98

কারো কাছে কি কোন ধারণা, আছে কেন এ removeRange পদ্ধতি AbstractList (এবং মধ্যে ArrayList ) হল protected? এটি বেশ সু-সংজ্ঞায়িত এবং কার্যকর অপারেশনের মতো দেখায় তবে এটি ব্যবহার করতে আমরা তালিকা প্রয়োগের সাবক্লাস করতে বাধ্য হই।

কিছু গোপন যৌক্তিকতা আছে? আমার কাছে একেবারেই অবর্ণনীয় বলে মনে হচ্ছে।

উত্তর:


163

হ্যাঁ, কারণ আপনি বাইরের কোড থেকে কোনও পরিসর সরিয়ে ফেলেন না। পরিবর্তে, এটি করুন:

list.subList(start, end).clear();

এটি আসলে removeRangeপর্দার আড়ালে কল করে।


ওপি জিজ্ঞাসা করে কেন পাবলিক এপিআইয়ের removeRangeঅংশ নয় List? কার্যকরী জাভা 2 য় সংস্থার আইটেম 40 এ কারণটি বর্ণিত হয়েছে, এবং আমি এটি এখানে উদ্ধৃত করছি:

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

একটি যুক্তি দিতে removeRangeপারে যে এর অনেকগুলি পরামিতি নেই এবং তাই সম্ভবত এই চিকিত্সার জন্য প্রার্থী নয়, তবে এটির removeRangeমাধ্যমে প্রার্থনা করার উপায় subListআছে, Listঅনর্থক পদ্ধতিতে ইন্টারফেসটিকে বিশৃঙ্খলা করার কোনও কারণ নেই ।


AbstractList.removeRange ডকুমেন্টেশন বলেছেন:

clearএই তালিকাটি অপারেশন দ্বারা এই তালিকাটিতে এবং এর সাবলিস্টগুলিকে বলা হয়। তালিকার প্রয়োগের অভ্যন্তরীণগুলির সুবিধা গ্রহণের জন্য এই পদ্ধতিটি ওভাররাইড করা এই তালিকা এবং এর সাবলিস্টে অপারেশনটির কার্যকারিতা যথেষ্ট পরিমাণে উন্নতি করতে পারে clear

এছাড়াও, ওপেনজেডিকে AbstractList.clearএবং বাস্তবায়ন দেখুন SubList.removeRange


9
ঠিক আছে, এটি সেভাবে করতে পারে তবে কেন ? বিশ্রী মনে হচ্ছে। একক উপাদানগুলি সরাসরি তালিকা থেকে সরানো যেতে পারে, তবে একাধিক উপাদান কেন নয়?
জুনাস পুলক্কা

4
@ জুনাস: কার্যকর জাভার আইটেম 40, 2 য় সংস্করণ এর জন্য যুক্তি বর্ণনা করে। আপনার কাছে বই না থাকলে আমি প্রাসঙ্গিক বিভাগে পেস্ট করব।
ক্রিস জেস্টার-ইয়ং

21
+1 (প্রশ্নের উত্তর) যাইহোক, কেবল কারণ হিসাবে একটি যুক্তি দেওয়া হয় এর অর্থ এটি বোঝা যায় না। প্যারামিটারের তালিকাগুলি সংক্ষিপ্ত করার প্রক্রিয়াটি একটি API এ উপলব্ধ অপারেশনগুলি বুঝতে বিকাশকারীদের ক্ষমতাকে বাধা দেয়, যা তালিকাগুলি প্রথম স্থানে সংক্ষিপ্ত করার কারণের বিরুদ্ধে সরাসরি কাজ করে।
স্যাম হারওয়েল

4
জাভা জন্য তাই সাধারণ। আসুন এটি সবচেয়ে জটিল এবং কমপক্ষে কার্যকর করুন।
টোমা জ্যাটো - মনিকা

4
একটি সাইড নোট হিসাবে, আপনি যে লক্ষ্য হয়নি removeRangeকল arraycopyঅকারণে যখন ArrayListসংস্করণ একটি সীমার তালিকার খুব শেষ পর্যন্ত spanning উপর ব্যবহার করা হয়? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/...numMoved 0, তাই সমগ্র arraycopy কোড একটি একক পুরা করে থাকেন পারে if(যেমন মধ্যে সম্পন্ন remove); পার্থক্য হচ্ছে ক) arraycopy একটি নেটিভ কল, incurring একটি ওভারহেড, খ) arraycopy হয় সবসময় প্যারাম জন্য শুদ্ধি পরীক্ষা stackoverflow.com/questions/12594046/...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.