সংগ্রহসমূহ.এম্পটিলিস্ট () বনাম নতুন উদাহরণ


241

বাস্তবে, এটা ভাল মত একটি খালি তালিকা আসতে হয় এই :

return Collections.emptyList();

বা এই মত :

return new ArrayList<Foo>();

অথবা আপনি ফিরে আসা তালিকার সাথে কী করতে যাচ্ছেন তার উপর এটি কি সম্পূর্ণ নির্ভরশীল?

উত্তর:


300

প্রধান পার্থক্য হ'ল স্থাবর তালিকাকে Collections.emptyList()ফিরিয়ে দেয় , অর্থাত্ এমন একটি তালিকা যা আপনি উপাদান যুক্ত করতে পারবেন না। ( জাভা 9 তে প্রবর্তিত ক্ষেত্রে একই প্রযোজ্য )List.of()

বিরল ক্ষেত্রে যেখানে আপনি না ফিরে তালিকা পরিবর্তন করতে চান, Collections.emptyList()এবং List.of()এইভাবে হয় না একটি ভাল পছন্দ।

আমি বলব যে অপরিবর্তনীয় তালিকা ফিরিয়ে দেওয়া পুরোপুরি ঠিক আছে (এবং এমনকি পছন্দসই উপায়) যতক্ষণ না চুক্তি (ডকুমেন্টেশন) স্পষ্টভাবে আলাদাভাবে না বলে।


উপরন্তু, emptyList() প্রতিটি কলের সাথে একটি নতুন অবজেক্ট তৈরি করতে পারেন।

এই পদ্ধতির প্রয়োগের জন্য প্রতিটি কলের জন্য পৃথক তালিকা অবজেক্ট তৈরি করা দরকার না। এই পদ্ধতিটি ব্যবহার করে পছন্দ মতো ক্ষেত্রটি ব্যবহার করার সাথে তুলনীয় ব্যয় হওয়ার সম্ভাবনা রয়েছে। (এই পদ্ধতির বিপরীতে, ক্ষেত্রটি ধরণের সুরক্ষা সরবরাহ করে না))

নীচের রূপগুলির বাস্তবায়ন emptyList:

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

সুতরাং যদি আপনার পদ্ধতিটি (যা একটি খালি তালিকা ফিরিয়ে দেয়) প্রায়শই বলা হয়, এই পদ্ধতির আপনাকে সিপিইউ এবং মেমরি অনুযায়ী উভয়ই সামান্য ভাল পারফরম্যান্স দিতে পারে।


4
সুতরাং, Collections.emptyList()এর ত্রুটি পরীক্ষা করা এবং এর মতো বলার জন্য আরও উপযুক্ত হবে?
মেরি

1
পরিবর্তে NullPointerExceptionফিরে এপিআই ক্লায়েন্টরা পাবেন না । Collections.emptyList()null
রিয়েলপিকে

@ পি কে_জে একটি গুরুত্বপূর্ণ বিষয় তুলে ধরেছে। Collections.emptyList()পুনরাবৃত্ত হয় এবং একটি দৈর্ঘ্য দেয়, সুতরাং এটি ব্যতিক্রম ছোঁড়া ছাড়া লুপ জন্য ব্যবহার করা যেতে পারে।
ndm13

ব্যবহার সম্পর্কে কি List.of()?

4
@ এজেডাব্লু, হ্যাঁ তবে তুলনায়, বলুন, new ArrayList<>()এটি নকশার সিদ্ধান্তকেও পরিষ্কার করে তোলে; উপাদানগুলি এই তালিকায় যুক্ত হবে না।
আইয়ুব

51

জাভা 5.0 দিয়ে শুরু করে আপনি ধারকটিতে উপাদানটির ধরণ উল্লেখ করতে পারেন:

Collections.<Foo>emptyList()

আমি অন্যান্য প্রতিক্রিয়াগুলির সাথে একমত হই যে যে ক্ষেত্রে আপনি খালি তালিকায় ফিরে আসতে চান যা খালি থেকে যায়, আপনার এই পদ্ধতির ব্যবহার করা উচিত।


38
জাভা 7 দিয়ে শুরু করে, আপনি সংকলকটিকে জেনেরিক পদ্ধতির অনুরোধের ধরণের পরামিতিটিকে লক্ষ্য প্রকার থেকে অনুমান করতে দিতে পারেন:List<Foo> list = Collections.emptyList()
পল জ্যাকসন

28

Collections.emptyList অপরিবর্তনীয় তাই দুটি সংস্করণের মধ্যে পার্থক্য রয়েছে তাই আপনাকে ফেরত মানটির ব্যবহারকারীদের বিবেচনা করতে হবে।

প্রত্যাবর্তন new ArrayList<Foo>সর্বদা অবজেক্টের একটি নতুন উদাহরণ তৈরি করে তাই এর সাথে খুব সামান্য অতিরিক্ত ব্যয় যুক্ত হয়েছে যা আপনাকে ব্যবহারের কারণ দিতে পারে Collections.emptyList। আমি emptyListএটি বেশি পাঠযোগ্য বলেই ব্যবহার করতে পছন্দ করি ।


14

সতর্ক থাকুন যদিও। আপনি যদি ফিরে আসেন Collections.emptyList()এবং তারপরে এর সাথে কিছু পরিবর্তন করার চেষ্টা করেন add()বা তার মতো স্মিথ করেন তবে আপনার একটি অপ্রচলিত বস্তু ফিরে আসার UnsupportedOperationException()কারণ হবে Collections.emptyList()


7

Collections.emptyList()যদি ফিরে তালিকাটি কোনওভাবেই পরিবর্তন করা না হয় তবে আমি যাব (তালিকাটি যেমন অপরিবর্তনীয়), অন্যথায় আমি বিকল্প 2 নিয়ে যাব।

এর সুবিধাটি Collections.emptyList()হ'ল প্রতি স্থানে একই স্থিতিযুক্ত উদাহরণটি ফিরে আসে এবং তাই প্রতিটি কলের জন্য কোনও প্রাকৃতিক ঘটনা ঘটেনি।


3

আপনি যদি নিশ্চিত হন যে ফেরত তালিকাটি কখনই সংশোধন করা হচ্ছে না তা সংগ্রহের সংগ্রহ.অ্যাম্পটিলিস্ট () ব্যবহার করুন। খালি তালিকা () বলার সময় এটিই ফিরে আসে:

/**
 * The empty list (immutable). 
 */
public static final List EMPTY_LIST = new EmptyList();

কল Collections.emptyList()করার কোনও নির্মাণ ব্যয় হয়েছে কিনা তা জানার চেষ্টা করে আমি এখানে পৌঁছেছি। বাস্তবায়ন বিশদটি (যদিও সমস্ত জেভিএম-তে সম্ভবত একই নয়) নিশ্চিত করে তা নিশ্চিত করে না। @ অতুল, এটি কোন জেভিএম থেকে এসেছে?
wjl

2

প্রদত্ত উত্তরগুলি এই চাপকে জোর দেয় যে 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 থেকে উত্স)


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

1
আমি যেমন আমার শব্দটির সাথে চাপ দেওয়ার চেষ্টা করেছি ( এটি কার্যকর হতে পারে ): এটি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে। আমি হয় সাধারণত পরিবর্তনীয় বা নিরবচ্ছিন্ন সংগ্রহগুলি ফিরিয়ে আনতে পারি, তারা খালি কিনা তা নির্ভর করে কোনও মিশ্রণ নয়। এবং "অনেক ধীর দাবি" পাল্টা: এই বর্তমান বাস্তবায়ন।
রেনি

ওহ, জেডিকে 2 তারিখের পুরানো সংস্করণ উদ্ধৃত করে আমার দিকে তাকাও। সুতরাং জাভা 8 প্রাথমিক আকারের 0 টি থেকে ডিফল্ট ক্ষমতা পর্যন্ত লাফিয়ে সম্পূর্ণরূপে বাধাটিকে এড়িয়ে চলে Sorry দুঃখিত আমি খুব ভুল ছিল।
প্যাট্রিক এম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.