উত্তর:
প্রধান পার্থক্য হ'ল স্থাবর তালিকাকে Collections.emptyList()
ফিরিয়ে দেয় , অর্থাত্ এমন একটি তালিকা যা আপনি উপাদান যুক্ত করতে পারবেন না। ( জাভা 9 তে প্রবর্তিত ক্ষেত্রে একই প্রযোজ্য )List.of()
বিরল ক্ষেত্রে যেখানে আপনি না ফিরে তালিকা পরিবর্তন করতে চান, Collections.emptyList()
এবং List.of()
এইভাবে হয় না একটি ভাল পছন্দ।
আমি বলব যে অপরিবর্তনীয় তালিকা ফিরিয়ে দেওয়া পুরোপুরি ঠিক আছে (এবং এমনকি পছন্দসই উপায়) যতক্ষণ না চুক্তি (ডকুমেন্টেশন) স্পষ্টভাবে আলাদাভাবে না বলে।
উপরন্তু, emptyList()
প্রতিটি কলের সাথে একটি নতুন অবজেক্ট তৈরি করতে পারেন।
এই পদ্ধতির প্রয়োগের জন্য প্রতিটি কলের জন্য পৃথক তালিকা অবজেক্ট তৈরি করা দরকার না। এই পদ্ধতিটি ব্যবহার করে পছন্দ মতো ক্ষেত্রটি ব্যবহার করার সাথে তুলনীয় ব্যয় হওয়ার সম্ভাবনা রয়েছে। (এই পদ্ধতির বিপরীতে, ক্ষেত্রটি ধরণের সুরক্ষা সরবরাহ করে না))
নীচের রূপগুলির বাস্তবায়ন emptyList
:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
সুতরাং যদি আপনার পদ্ধতিটি (যা একটি খালি তালিকা ফিরিয়ে দেয়) প্রায়শই বলা হয়, এই পদ্ধতির আপনাকে সিপিইউ এবং মেমরি অনুযায়ী উভয়ই সামান্য ভাল পারফরম্যান্স দিতে পারে।
NullPointerException
ফিরে এপিআই ক্লায়েন্টরা পাবেন না । Collections.emptyList()
null
Collections.emptyList()
পুনরাবৃত্ত হয় এবং একটি দৈর্ঘ্য দেয়, সুতরাং এটি ব্যতিক্রম ছোঁড়া ছাড়া লুপ জন্য ব্যবহার করা যেতে পারে।
new ArrayList<>()
এটি নকশার সিদ্ধান্তকেও পরিষ্কার করে তোলে; উপাদানগুলি এই তালিকায় যুক্ত হবে না।
জাভা 5.0 দিয়ে শুরু করে আপনি ধারকটিতে উপাদানটির ধরণ উল্লেখ করতে পারেন:
Collections.<Foo>emptyList()
আমি অন্যান্য প্রতিক্রিয়াগুলির সাথে একমত হই যে যে ক্ষেত্রে আপনি খালি তালিকায় ফিরে আসতে চান যা খালি থেকে যায়, আপনার এই পদ্ধতির ব্যবহার করা উচিত।
List<Foo> list = Collections.emptyList()
Collections.emptyList
অপরিবর্তনীয় তাই দুটি সংস্করণের মধ্যে পার্থক্য রয়েছে তাই আপনাকে ফেরত মানটির ব্যবহারকারীদের বিবেচনা করতে হবে।
প্রত্যাবর্তন new ArrayList<Foo>
সর্বদা অবজেক্টের একটি নতুন উদাহরণ তৈরি করে তাই এর সাথে খুব সামান্য অতিরিক্ত ব্যয় যুক্ত হয়েছে যা আপনাকে ব্যবহারের কারণ দিতে পারে Collections.emptyList
। আমি emptyList
এটি বেশি পাঠযোগ্য বলেই ব্যবহার করতে পছন্দ করি ।
সতর্ক থাকুন যদিও। আপনি যদি ফিরে আসেন Collections.emptyList()
এবং তারপরে এর সাথে কিছু পরিবর্তন করার চেষ্টা করেন add()
বা তার মতো স্মিথ করেন তবে আপনার একটি অপ্রচলিত বস্তু ফিরে আসার UnsupportedOperationException()
কারণ হবে Collections.emptyList()
।
Collections.emptyList()
যদি ফিরে তালিকাটি কোনওভাবেই পরিবর্তন করা না হয় তবে আমি যাব (তালিকাটি যেমন অপরিবর্তনীয়), অন্যথায় আমি বিকল্প 2 নিয়ে যাব।
এর সুবিধাটি Collections.emptyList()
হ'ল প্রতি স্থানে একই স্থিতিযুক্ত উদাহরণটি ফিরে আসে এবং তাই প্রতিটি কলের জন্য কোনও প্রাকৃতিক ঘটনা ঘটেনি।
আপনি যদি নিশ্চিত হন যে ফেরত তালিকাটি কখনই সংশোধন করা হচ্ছে না তা সংগ্রহের সংগ্রহ.অ্যাম্পটিলিস্ট () ব্যবহার করুন। খালি তালিকা () বলার সময় এটিই ফিরে আসে:
/**
* The empty list (immutable).
*/
public static final List EMPTY_LIST = new EmptyList();
Collections.emptyList()
করার কোনও নির্মাণ ব্যয় হয়েছে কিনা তা জানার চেষ্টা করে আমি এখানে পৌঁছেছি। বাস্তবায়ন বিশদটি (যদিও সমস্ত জেভিএম-তে সম্ভবত একই নয়) নিশ্চিত করে তা নিশ্চিত করে না। @ অতুল, এটি কোন জেভিএম থেকে এসেছে?
প্রদত্ত উত্তরগুলি এই চাপকে জোর দেয় যে emptyList()
অপরিবর্তনীয় ফিরে আসে List
তবে বিকল্প দেয় না। কনস্ট্রাক্টর ArrayList(int initialCapacity)
বিশেষ কেসগুলি 0
যাতে new ArrayList<>(0)
পরিবর্তে ফিরে new ArrayList<>()
আসাও এটি একটি কার্যকর সমাধান হতে পারে:
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
[...]
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
(জাভা 1.8.0_72 থেকে উত্স)
Collections.emptyList()
এর ত্রুটি পরীক্ষা করা এবং এর মতো বলার জন্য আরও উপযুক্ত হবে?