আমি কীভাবে একটি স্থিতিশীল মানচিত্রের সূচনা করতে পারি?


1131

আপনি Mapজাভাতে কোনও স্ট্যাটিক কীভাবে শুরু করবেন ?

একটি পদ্ধতি: স্ট্যাটিক ইনিশিয়ালাইজার
পদ্ধতি দুটি: ইনসেন্ট ইনিশিয়ালাইজার (বেনামে সাবক্লাস) বা অন্য কোনও পদ্ধতি?

প্রতিটি আগপাছ কি হয়?

দুটি পদ্ধতি ব্যাখ্যা করার জন্য এখানে একটি উদাহরণ দেওয়া হল:

import java.util.HashMap;
import java.util.Map;

public class Test {
    private static final Map<Integer, String> myMap = new HashMap<>();
    static {
        myMap.put(1, "one");
        myMap.put(2, "two");
    }

    private static final Map<Integer, String> myMap2 = new HashMap<>(){
        {
            put(1, "one");
            put(2, "two");
        }
    };
}

2
: 8 জাভা থাকা একটি মানচিত্র আরম্ভের জন্য stackoverflow.com/a/37384773/1216775
akhil_mittal

2
দয়া করে, কখনও ডাবল ব্রেস সূচনা ব্যবহার করবেন না - এটি হ্যাক এবং মেমরি ফাঁস করার এবং অন্যান্য সমস্যার কারণ হওয়ার একটি সহজ উপায়।
ডিমো 414

জাভা 9? তাহলে এন্ট্রি গণনা <= 10 ব্যবহার Map.ofআর Map.ofEntries, চেক stackoverflow.com/a/37384773/1216775
akhil_mittal

উত্তর:


1106

উদাহরণস্বরূপ এই ক্ষেত্রে সিনট্যাকটিক চিনি ঠিক আছে, তাই না? সবেমাত্র আরম্ভ করার জন্য আপনার অতিরিক্ত বেনাম শ্রেণীর প্রয়োজন কেন আমি তা দেখতে পাচ্ছি না। এবং শ্রেণিটি তৈরি করা চূড়ান্ত হলে এটি কাজ করবে না।

আপনি স্ট্যাটিক ইনিশিয়ালাইজারটি ব্যবহার করে একটি পরিবর্তনযোগ্য মানচিত্র তৈরি করতে পারেন:

public class Test {
    private static final Map<Integer, String> myMap;
    static {
        Map<Integer, String> aMap = ....;
        aMap.put(1, "one");
        aMap.put(2, "two");
        myMap = Collections.unmodifiableMap(aMap);
    }
}

10
এটি হ'ল প্রতিমাটি আমি বছরের পর বছর ধরে ব্যবহার করেছি এবং এটির জন্য আমি কখনই কারও নজর পড়িনি। আমি অবিরাম পরিবর্তনযোগ্য ধ্রুবক সেট এবং তালিকাগুলির জন্যও একই কাজ করি।
jasonmp85

3
আমি কীভাবে একটি স্ট্রিং কী সহ একটি হ্যাশম্যাপ <স্ট্রিং, স্ট্রিং> পরিচালনা করব। মানচিত্র অবজেক্টটি আমাকে স্ট্রিং কী রাখার অনুমতি দেয় না যাতে আমি আনমডিফাইয়েবল ম্যাপ () ব্যবহার করতে পারি না। আমার ধারণা, কোনও হ্যাশম্যাপে কাস্টিং করা উদ্দেশ্যটিকেও পরাজিত করবে। কোন ধারনা?
লুক

30
@ লুক আমি গুরুতরভাবে সন্দেহ করি যে অ্যান্ড্রয়েডের এমন সীমাবদ্ধতা রয়েছে। সার্বিকভাবে এর কোনো অর্থ নেই. একটি দ্রুত অনুসন্ধানে এখানে (এবং আরও অনেক) এই প্রশ্নটি পাওয়া গেছে যা দেখে মনে হয় আপনি অ্যান্ড্রয়েডে মানচিত্রের জন্য স্ট্রিং কী ব্যবহার করতে পারেন।
mluisbrown

11
সুতরাং অন্য কেউ তদন্ত করতে বিরক্ত করে না, আমি নিশ্চিত করতে পারি যে অ্যান্ড্রয়েডে মানচিত্রের জন্য স্ট্রিং কী ব্যবহার করতে কোনও সমস্যা নেই।
জর্দান

11
জর্দান: এটি এখন একটি পুরানো বিষয় তবে আমি সন্দেহ করি @ লুক কোনও মানচিত্রের কী হিসাবে স্ট্রিং ব্যবহার করার চেষ্টা করছেন যা আলাদা কী ধরণের ছিল, যেমন মানচিত্র <পূর্ণসংখ্যা, স্ট্রিং>।
দুর্ভাগ্য পরিবর্তনশীল

445

আমি স্থিতিশীল, অপরিবর্তনীয় মানচিত্র শুরু করার পেয়ারা পদ্ধতি পছন্দ করি :

static final Map<Integer, String> MY_MAP = ImmutableMap.of(
    1, "one",
    2, "two"
);

আপনি দেখতে পাচ্ছেন যে এটি খুব সংক্ষিপ্ত (কারখানায় সুবিধাজনক কারখানার পদ্ধতিগুলির কারণে ImmutableMap)।

আপনি যদি মানচিত্রে 5 টিরও বেশি এন্ট্রি রাখতে চান তবে আপনি আর ব্যবহার করতে পারবেন না ImmutableMap.of()। পরিবর্তে, ImmutableMap.builder()এই লাইন বরাবর চেষ্টা করুন :

static final Map<Integer, String> MY_MAP = ImmutableMap.<Integer, String>builder()
    .put(1, "one")
    .put(2, "two")
    // ... 
    .put(15, "fifteen")
    .build();

পেয়ারা এর অপরিবর্তনীয় সংগ্রহ ইউটিলিটি সুবিধা সম্পর্কে আরও জানতে, ব্যাখ্যা অপরিবর্তনীয় সংগ্রহগুলি পেয়ারা ইউজার গাইড মধ্যে

(একটি উপসেট) পেয়ারা গুগল কালেকশন বলা হত । আপনি যদি এখনও নিজের জাভা প্রকল্পে এই লাইব্রেরিটি ব্যবহার না করে থাকেন তবে আমি দৃ strongly়ভাবে এটি চেষ্টা করার পরামর্শ দিচ্ছি ! সাথী এসও ব্যবহারকারীরা সম্মত হওয়ায় পেয়ারা দ্রুত জাভার জন্য অন্যতম জনপ্রিয় এবং দরকারী ফ্রি 3 য় পক্ষের libs হয়ে উঠেছে । (আপনি যদি এটিতে নতুন হন তবে সেই লিঙ্কটির পিছনে কিছু দুর্দান্ত শিখনের সংস্থান রয়েছে))


আপডেট (2015) : জাভা 8 এর জন্য , ভাল, আমি এখনও পেয়ারা পদ্ধতির ব্যবহার করব কারণ এটি অন্য যে কোনও কিছুর চেয়ে পরিষ্কার clean আপনি যদি পেয়ারা নির্ভরতা না চান, একটি সাধারণ পুরানো আরম্ভ পদ্ধতি বিবেচনা করুনদ্বি-মাত্রিক অ্যারে এবং স্ট্রিম এপিআই সহ হ্যাকটি বেশ কুৎসিত আপনি যদি আমাকে জিজ্ঞাসা করেন, এবং আপনাকে যদি এমন মানচিত্র তৈরি করতে হবে যাটির কী এবং মান একই ধরণের নয় (যেমন Map<Integer, String>প্রশ্নটিতে থাকে) খুব খারাপ হয়।

জাভা 8 সম্পর্কিত সাধারণভাবে পেয়ারার ভবিষ্যতের বিষয়ে, লুই ওয়াসেরম্যান ২০১৪ সালে এই কথা বলেছিলেন এবং [ আপডেট ] ২০১ in সালে ঘোষণা করা হয়েছিল যে পেয়ারা ২১ জাভা ৮ এর প্রয়োজন হবে এবং সঠিকভাবে সমর্থন করবে


আপডেট ( ২০১ )) : তাগীর বলিভ যেমন উল্লেখ করেছেন , শেষ পর্যন্ত জাভা 9 সংগ্রহের জন্য সুবিধামত কারখানার পদ্ধতি যুক্ত করে খাঁটি জেডিকে ব্যতীত অন্য কিছুই ব্যবহার না করে এটি পরিষ্কার করে দেবে :

static final Map<Integer, String> MY_MAP = Map.of(
    1, "one", 
    2, "two"
);

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

2
আমি সম্মত, এটি একটি ধ্রুবক মানচিত্রের সূচনা করার সর্বোত্তম উপায়। কেবলমাত্র বেশি পঠনযোগ্য নয়, যেহেতু কালেকশনস.অনোমডিফাইয়েবল ম্যাপ অন্তর্নিহিত মানচিত্রের কেবল পঠনযোগ্য দর্শনটি ফেরত দেয় (এটি এখনও সংশোধনযোগ্য হতে পারে)।
ক্রাঙ্কডগ

11
আমি এখন মুছে ফেলা প্রশ্নগুলি দেখতে পাচ্ছি (10 কে + রেপ সহ), সুতরাং এখানে 'সবচেয়ে দরকারী নিখরচায় তৃতীয় পক্ষের জাভা লাইব্রেরি'র একটি অনুলিপি দেওয়া আছে । এটি কেবলমাত্র প্রথম পৃষ্ঠা, তবে অন্তত উপরে উল্লিখিত পেয়ারা সংস্থানগুলি আপনি খুঁজে পেতে পারেন ।
জোনিক

2
আমি সত্যিই এই পদ্ধতির পছন্দ করি, যদিও অতিরিক্ত নির্ভরতা ছাড়াই এটি কীভাবে করা যায় তা জেনে রাখা উপকারী।
মোচড়ের

2
জেপ 186 এখনও বন্ধ নেই, তাই এটি সংগ্রহের
আক্ষরিক

182

আমি ব্যবহার করব:

public class Test {
    private static final Map<Integer, String> MY_MAP = createMap();

    private static Map<Integer, String> createMap() {
        Map<Integer, String> result = new HashMap<>();
        result.put(1, "one");
        result.put(2, "two");
        return Collections.unmodifiableMap(result);
    }
}
  1. এটি একটি বেনাম শ্রেণিকে এড়িয়ে যায়, যা আমি ব্যক্তিগতভাবে একটি খারাপ শৈলী হিসাবে বিবেচনা করি এবং এড়াতে পারি
  2. এটি মানচিত্রের সৃষ্টি আরও স্পষ্ট করে তোলে
  3. এটি মানচিত্রটি পরিবর্তনযোগ্য নয়
  4. MY_MAP যেহেতু ধ্রুবক তাই আমি এটির নাম ধ্রুবকের মতো করব

3
খাঁটি জেডিকে বিকল্পগুলির মধ্যে (কোনও লিবস নেই), আমি এটি সবচেয়ে পছন্দ করি কারণ মানচিত্রের সংজ্ঞাটি এর সূচনাতে স্পষ্টভাবে লিঙ্কযুক্ত। অবিচ্ছিন্ন নামকরণেও সম্মত হন।
জোনিক

আমার কাছে কখনও ঘটেনি যে আপনি এটি করতে পারেন।
রোমুলুসনর

181

জাভা 5 এটি আরও কমপ্যাক্ট সিনট্যাক্স সরবরাহ করে:

static final Map<String , String> FLAVORS = new HashMap<String , String>() {{
    put("Up",    "Down");
    put("Charm", "Strange");
    put("Top",   "Bottom");
}};

46
সেই কৌশলটিকে ডাবল ব্রেস ইনিশিয়ালাইজেশন বলা হয়: স্ট্যাকওভারফ্লো.com / জিজ্ঞাসা / ১৩72২১১৩/২ এটি কোনও বিশেষ জাভা ৫ সিনট্যাক্স নয়, এটি উদাহরণস্বরূপ একটি বেনাম শ্রেণীর সাথে একটি কৌশল মাত্র।
জেস্পার

13
ডাবল ব্রেস প্রারম্ভিককরণ সম্পর্কিত দ্রুত প্রশ্ন: এটি করার সময়, গ্রহনটি অনুপস্থিত সিরিয়াল আইডি সম্পর্কে একটি সতর্কতা জারি করে। একদিকে, আমি দেখতে পাচ্ছি না যে এই নির্দিষ্ট ক্ষেত্রে কেন সিরিয়াল আইডি লাগবে, তবে অন্যদিকে, আমি সাধারণত সাবধানবাণী সাবধান করে দেওয়া পছন্দ করি না। এ ব্যাপারে আপনার চিন্তা - ভাবনা কি?
nbarraille

8
যে @nbarraille কারণ HashMap implements Serializable। যেহেতু আপনি এই "ট্রিক" ব্যবহার করে হ্যাশম্যাপের প্রকৃত সাবক্লাস তৈরি করেছেন তাই আপনি স্পষ্টতই সিরিয়ালাইজেবল বর্গ তৈরি করছেন। এবং এর জন্য আপনার একটি সিরিয়ালিউড সরবরাহ করা উচিত।
Noone

5
Double brace initialization can cause memory leaks when used from a non-static context, because the anonymous class created will maintain a reference to the surrounding object. It has worse performance than regular initialization because of the additional class loading required. It can cause equals() comparisons to fail, if the equals() method does not accept subclasses as parameter. And finally, pre Java 9 it cannot be combined with the diamond operator, because that cannot be used with anonymous classes.- ইন্টেলিজ
মার্ক জেরোনিমাস

3
@MarkJeronimus - প্রস্তাবিত ব্যবহার হয় একটি স্ট্যাটিক প্রসঙ্গ। পারফরম্যান্স খারাপ হতে পারে, তবে সম্ভবত অল্প সংখ্যক স্থিতিকৃত সংজ্ঞায়িত মানচিত্রের সাথে কাজ করার সময় লক্ষণীয় নয়। HashMap.equalsসংজ্ঞায়িত করা হয় AbstractMapএবং মানচিত্রের যে কোনও সাবক্লাসে কাজ করে , তাই এটি এখানে কোনও উদ্বেগ নয়। হীরা অপারেটর জিনিস বিরক্তিকর, তবে উল্লিখিত হিসাবে এখন সমাধান করা হয়েছে।
জুলাই

95

দ্বিতীয় পদ্ধতির একটি সুবিধা হ'ল আপনি এটিকে আবদ্ধ করতে পারেন Collections.unmodifiableMap()যে গ্যারান্টি দিয়ে যে কোনও কিছু পরে সংগ্রহ আপডেট করা যাচ্ছে না:

private static final Map<Integer, String> CONSTANT_MAP = 
    Collections.unmodifiableMap(new HashMap<Integer, String>() {{ 
        put(1, "one");
        put(2, "two");
    }});

 // later on...

 CONSTANT_MAP.put(3, "three"); // going to throw an exception!

3
নতুন অপারেটরটিকে স্থির {} ব্লকে সরানো এবং এটি মোড়ানো করে আপনি প্রথম পদ্ধতিতে সহজেই এটি করতে পারবেন না?
প্যাট্রিক

2
আমি কনস্ট্রাক্টর কলটিকে যাইহোক স্থিতিশীল আরম্ভের মধ্যে স্থানান্তরিত করব। অন্য যে কোনও কিছুই কেবল বিজোড় দেখাচ্ছে।
টম হাটিন - ২১ শে

2
কোনও কংক্রিট শ্রেণীর বিপরীতে বেনাম শ্রেণি ব্যবহার করে পারফরম্যান্সের কী প্রভাব পড়তে পারে?
কিপ

62

এখানে একটি জাভা 8 এক-লাইন স্থির মানচিত্রের সূচনা:

private static final Map<String, String> EXTENSION_TO_MIMETYPE =
    Arrays.stream(new String[][] {
        { "txt", "text/plain" }, 
        { "html", "text/html" }, 
        { "js", "application/javascript" },
        { "css", "text/css" },
        { "xml", "application/xml" },
        { "png", "image/png" }, 
        { "gif", "image/gif" }, 
        { "jpg", "image/jpeg" },
        { "jpeg", "image/jpeg" }, 
        { "svg", "image/svg+xml" },
    }).collect(Collectors.toMap(kv -> kv[0], kv -> kv[1]));

সম্পাদনা করুন: Map<Integer, String>প্রশ্নের মতো একটি সূচনা করতে আপনার এই জাতীয় কিছু দরকার হবে:

static final Map<Integer, String> MY_MAP = Arrays.stream(new Object[][]{
        {1, "one"},
        {2, "two"},
}).collect(Collectors.toMap(kv -> (Integer) kv[0], kv -> (String) kv[1]));

সম্পাদনা (2): i_am_zero দ্বারা আরও ভাল, মিশ্র-টাইপ-সক্ষম সংস্করণ রয়েছে যা new SimpleEntry<>(k, v)কলগুলির একটি স্ট্রিম ব্যবহার করে। উত্তরটি দেখুন: https://stackoverflow.com/a/37384773/3950982


7
প্রশ্ন এবং অন্যান্য উত্তরের সমতুল্য একটি সংস্করণ যুক্ত করার জন্য আমি স্বাধীনতা নিয়েছি: একটি মানচিত্র চালু করুন যার কী এবং মানগুলি বিভিন্ন ধরণের (তাই String[][]না, Object[][]প্রয়োজন হবে)। আইএমএইচও, এই পদ্ধতিটি কুরুচিপূর্ণ (ক্যাসেটগুলির সাথে আরও বেশি) এবং মনে রাখা খুব কঠিন; এটি নিজে ব্যবহার করবেন না
জোনিক

57

Map.of জাভা 9+ এ

private static final Map<Integer, String> MY_MAP = Map.of(1, "one", 2, "two");

বিস্তারিত জানার জন্য JEP 269 দেখুন । জেডি কে 9 সেপ্টেম্বর 2017 এ সাধারণ উপলব্ধিতে পৌঁছেছে ।


7
অথবা আপনি যদি 10 টিরও বেশি মূল-মান Map.ofEntries
জোড় চান

8
এটি পরিষ্কার এবং সমস্ত, যতক্ষণ না আপনি বুঝতে পেরেছেন কীভাবে এটি বাস্তবায়িত হয়েছিল
মাঝামাঝি '

উগ এত দুঃখজনক - দেখে মনে হচ্ছে এটি কেবলমাত্র 10 টি এন্ট্রি সমর্থন করে, এরপরে আপনাকে এজেন্ট্রি ব্যবহার করা দরকার। পঙ্গু.
সোমাইয়া কুম্বেরের

2
জেদেকে বাস্তবায়নের পরিচ্ছন্নতা যতক্ষণ না এটি কাজ করে এবং চুক্তিটি সন্তুষ্ট করে ততক্ষণ গুরুত্বপূর্ণ নয়। যে কোনও ব্ল্যাক বক্সের মতো, বাস্তবায়নের বিশদটি যদি প্রয়োজন হয় তবে ভবিষ্যতে সবসময় ঠিক করা যায় ...
ভাইকিংস্টিভ

@ মিড এটি জাভাতে এটি করার একমাত্র টাইপসেফ উপায়।
লুক হাচিসন

44

জাভা 9

আমরা প্রতিটি এন্ট্রি তৈরি করতে Map.ofEntriesকল Map.entry( k , v )করে ব্যবহার করতে পারি ।

import static java.util.Map.entry;
private static final Map<Integer,String> map = Map.ofEntries(
        entry(1, "one"),
        entry(2, "two"),
        entry(3, "three"),
        entry(4, "four"),
        entry(5, "five"),
        entry(6, "six"),
        entry(7, "seven"),
        entry(8, "eight"),
        entry(9, "nine"),
        entry(10, "ten"));

আমরা এখানেMap.of তার উত্তরে তাগীরের পরামর্শ অনুযায়ী ব্যবহার করতে পারি তবে আমাদের 10 টিরও বেশি এন্ট্রি ব্যবহার করতে পারে না ।Map.of

জাভা 8 (ঝরঝরে সমাধান)

আমরা মানচিত্রের এন্ট্রিগুলির একটি স্ট্রিম তৈরি করতে পারি। আমরা ইতিমধ্যে দুটি বাস্তবায়নের আছে Entryমধ্যে java.util.AbstractMapযা হয় SimpleEntry এবং SimpleImmutableEntry । এই উদাহরণের জন্য আমরা প্রাক্তন হিসাবে ব্যবহার করতে পারি:

import java.util.AbstractMap.*;
private static final Map<Integer, String> myMap = Stream.of(
            new SimpleEntry<>(1, "one"),
            new SimpleEntry<>(2, "two"),
            new SimpleEntry<>(3, "three"),
            new SimpleEntry<>(4, "four"),
            new SimpleEntry<>(5, "five"),
            new SimpleEntry<>(6, "six"),
            new SimpleEntry<>(7, "seven"),
            new SimpleEntry<>(8, "eight"),
            new SimpleEntry<>(9, "nine"),
            new SimpleEntry<>(10, "ten"))
            .collect(Collectors.toMap(SimpleEntry::getKey, SimpleEntry::getValue));

2
new SimpleEntry<>()পথ স্ট্যাটিক চেয়ে অনেক কম পাঠযোগ্য put(): /
Danon

32

Eclipse সংগ্রহের সাথে , নীচের সমস্তগুলি কাজ করবে:

import java.util.Map;

import org.eclipse.collections.api.map.ImmutableMap;
import org.eclipse.collections.api.map.MutableMap;
import org.eclipse.collections.impl.factory.Maps;

public class StaticMapsTest
{
    private static final Map<Integer, String> MAP =
        Maps.mutable.with(1, "one", 2, "two");

    private static final MutableMap<Integer, String> MUTABLE_MAP =
       Maps.mutable.with(1, "one", 2, "two");


    private static final MutableMap<Integer, String> UNMODIFIABLE_MAP =
        Maps.mutable.with(1, "one", 2, "two").asUnmodifiable();


    private static final MutableMap<Integer, String> SYNCHRONIZED_MAP =
        Maps.mutable.with(1, "one", 2, "two").asSynchronized();


    private static final ImmutableMap<Integer, String> IMMUTABLE_MAP =
        Maps.mutable.with(1, "one", 2, "two").toImmutable();


    private static final ImmutableMap<Integer, String> IMMUTABLE_MAP2 =
        Maps.immutable.with(1, "one", 2, "two");
}

আপনি ইলিপস সংগ্রহের মাধ্যমে স্টেটিক্যালি আদিম মানচিত্রের সূচনা করতে পারেন।

import org.eclipse.collections.api.map.primitive.ImmutableIntObjectMap;
import org.eclipse.collections.api.map.primitive.MutableIntObjectMap;
import org.eclipse.collections.impl.factory.primitive.IntObjectMaps;

public class StaticPrimitiveMapsTest
{
    private static final MutableIntObjectMap<String> MUTABLE_INT_OBJ_MAP =
            IntObjectMaps.mutable.<String>empty()
                    .withKeyValue(1, "one")
                    .withKeyValue(2, "two");

    private static final MutableIntObjectMap<String> UNMODIFIABLE_INT_OBJ_MAP =
            IntObjectMaps.mutable.<String>empty()
                    .withKeyValue(1, "one")
                    .withKeyValue(2, "two")
                    .asUnmodifiable();

    private static final MutableIntObjectMap<String> SYNCHRONIZED_INT_OBJ_MAP =
            IntObjectMaps.mutable.<String>empty()
                    .withKeyValue(1, "one")
                    .withKeyValue(2, "two")
                    .asSynchronized();

    private static final ImmutableIntObjectMap<String> IMMUTABLE_INT_OBJ_MAP =
            IntObjectMaps.mutable.<String>empty()
                    .withKeyValue(1, "one")
                    .withKeyValue(2, "two")
                    .toImmutable();

    private static final ImmutableIntObjectMap<String> IMMUTABLE_INT_OBJ_MAP2 =
            IntObjectMaps.immutable.<String>empty()
                    .newWithKeyValue(1, "one")
                    .newWithKeyValue(2, "two");
} 

দ্রষ্টব্য: আমি গ্রহগ্রাহ সংগ্রহের প্রতিশ্রুতিবদ্ধ


1
আমি সত্যিই কামনা করছি যে জাভা-র জন্য গ্রহন সংগ্রহগুলি ডিফল্ট সংগ্রহ গ্রন্থাগার ছিল। আমি এটি পেয়ারা + জেসিএল এর চেয়ে অনেক বেশি উপভোগ করি।
কেনি কেসন

29

আমি এই পরিস্থিতিতে কোনও বেনামে সাবক্লাস তৈরি করব না। স্ট্যাটিক ইনিশিয়ালাইজারগুলি সমানভাবে ভাল কাজ করে, আপনি যদি মানচিত্রটিকে অবিচ্ছেদ্য করতে চান উদাহরণস্বরূপ:

private static final Map<Integer, String> MY_MAP;
static
{
    Map<Integer, String>tempMap = new HashMap<Integer, String>();
    tempMap.put(1, "one");
    tempMap.put(2, "two");
    MY_MAP = Collections.unmodifiableMap(tempMap);
}

1
কোন পরিস্থিতিতে আপনি তখন একটি হ্যাশম্যাপ শুরু করতে বেনামে সাবক্লাস ব্যবহার করবেন?
কুকবাবেন

6
কোনও সংগ্রহ আরম্ভ করার জন্য কখনও নয়।
এলজেঞ্জো

আপনি কী ব্যাখ্যা করতে পারেন যে স্ট্যাটিক ইনিশিয়ালাইজারটি বেনামে সাবক্লাস তৈরির চেয়ে ভাল পছন্দ কেন?
লেবা-লেভ

3
@ রুকি স্থির আরম্ভের পক্ষে অন্য উত্তরে দেওয়া বিভিন্ন কারণ রয়েছে। লক্ষ্য এখানে হয় আরম্ভ করতে, তবে কেন subclassing আনতে, কয়েক কীস্ট্রোকগুলি সংরক্ষণ করতে হয়তো ছাড়া? (আপনি যদি কীস্ট্রোকগুলিতে সঞ্চয় করতে চান তবে প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসাবে জাভা অবশ্যই ভাল পছন্দ নয়)) জাভাতে প্রোগ্রামিং করার সময় আমি থাম্বের একটি নিয়ম ব্যবহার করি: যতটা সম্ভব কম সাবক্লাস (এবং কখনই এটি যুক্তিযুক্তভাবে এড়ানো যায় না)।
এলজেঞ্জো

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

18

গুগল সংগ্রহগুলি দেখুন , যেমন তাদের পৃষ্ঠায় যে ভিডিও রয়েছে তা পরীক্ষা করা আকর্ষণীয় হতে পারে । তারা মানচিত্র এবং সেট সূচনা করার বিভিন্ন উপায় সরবরাহ করে এবং পাশাপাশি অপরিবর্তনীয় সংগ্রহ সরবরাহ করে।

আপডেট: এই গ্রন্থাগারের এখন নাম রাখা হয়েছে পেয়ারা


17

আমি বেনাম শ্রেণি পছন্দ করি, কারণ এটি মোকাবেলা করা সহজ:

public static final Map<?, ?> numbers = Collections.unmodifiableMap(new HashMap<Integer, String>() {
    {
        put(1, "some value");
                    //rest of code here
    }
});

12
public class Test {
    private static final Map<Integer, String> myMap;
    static {
        Map<Integer, String> aMap = ....;
        aMap.put(1, "one");
        aMap.put(2, "two");
        myMap = Collections.unmodifiableMap(aMap);
    }
}

যদি আমরা একাধিক ধ্রুবক ঘোষণা করি তবে সেই কোডটি স্ট্যাটিক ব্লকে লেখা হবে এবং ভবিষ্যতে এটি বজায় রাখা শক্ত। সুতরাং বেনামে ক্লাস ব্যবহার করা ভাল।

public class Test {

    public static final Map numbers = Collections.unmodifiableMap(new HashMap(2, 1.0f){
        {
            put(1, "one");
            put(2, "two");
        }
    });
}

এবং এটি স্থির হিসাবে অন্য হিসাবে বিবেচনা করা যায় না স্থিরকারীদের জন্য unmodifiableMap ব্যবহার করার পরামর্শ দেওয়া হয়।


10

স্ট্যাটিক ব্লক শৈলীর চেয়ে আমি "ডাবল ব্রেস সূচনা" স্টাইলকে দৃ style়ভাবে প্রস্তাব দিতে পারি।

কেউ মন্তব্য করতে পারে যে তারা বেনামে বর্গ, ওভারহেড, অভিনয় ইত্যাদি পছন্দ করে না

তবে আমি আরও বিবেচনা করি হ'ল কোড পাঠযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা। এই দৃষ্টিতে, আমি দাঁড়িয়েছি একটি ডাবল ব্রেস একটি ভাল কোড শৈলী বরং স্থির পদ্ধতি।

  1. উপাদানগুলি নেস্টেড এবং ইনলাইন হয়।
  2. এটি আরও ওও, পদ্ধতিগত নয়।
  3. পারফরম্যান্স প্রভাব সত্যিই ছোট এবং উপেক্ষা করা যেতে পারে।
  4. ভাল আইডিই আউটলাইন সমর্থন (বরং অনেক বেনামে স্ট্যাটিক}} ব্লক)
  5. তাদের সম্পর্ক আনতে আপনি কয়েকটি লাইনের মন্তব্যে সংরক্ষণ করেছেন।
  6. ব্যতিক্রম এবং বাইটকোড অপ্টিমাইজার থেকে সম্ভাব্য উপাদান ফুটো / ইনসাইটিসাইজড অবজেক্টের উদাহরণের নেতৃত্ব প্রতিরোধ করুন।
  7. স্ট্যাটিক ব্লক কার্যকর করার আদেশ সম্পর্কে কোনও উদ্বেগ নেই।

এছাড়াও, এটি আপনি বেনাম শ্রেণীর জিসিকে সচেতন করেছেন, আপনি সর্বদা এটি ব্যবহার করে এটি একটি সাধারণ হ্যাশম্যাপে রূপান্তর করতে পারেন new HashMap(Map map)

আপনি অন্য সমস্যার মুখোমুখি না হওয়া পর্যন্ত আপনি এটি করতে পারেন। যদি আপনি এটি করেন তবে আপনার এটির জন্য সম্পূর্ণ অন্য কোডিং শৈলী ব্যবহার করা উচিত (যেমন কোনও স্ট্যাটিক, কারখানার শ্রেণি নেই)।


8

যথারীতি অ্যাপাচি -কমন্সে যথাযথ পদ্ধতি ম্যাপআপিলস.পুটআল রয়েছে (মানচিত্র, অবজেক্ট []) :

উদাহরণস্বরূপ, রঙিন মানচিত্র তৈরি করতে:

Map<String, String> colorMap = MapUtils.putAll(new HashMap<String, String>(), new String[][] {
     {"RED", "#FF0000"},
     {"GREEN", "#00FF00"},
     {"BLUE", "#0000FF"}
 });

আমি অ্যাপাচি কমন্সকে সমস্ত বিল্ডগুলিতে অন্তর্ভুক্ত করেছি সুতরাং, Arrays.asMap( ... )সরল জাভাতে কোনও পদ্ধতির দুর্ভাগ্যজনক অনুপস্থিতিতে , আমি মনে করি এটিই সেরা সমাধান। চাকা পুনর্নির্মাণ সাধারণত নির্বোধ হয়। খুব সামান্য খারাপ দিকটি হ'ল জেনারিকের সাথে এটির একটি চেক না হওয়া রূপান্তর প্রয়োজন।
মাইকে রডেন্ট

@ মাইক্রোডেন্ট 4.1 সংস্করণটি জেনেরিক: পাবলিক স্ট্যাটিক <কে, ভি> ম্যাপ <কে, ভি> পুটএল (চূড়ান্ত মানচিত্র <কে, ভি> মানচিত্র, চূড়ান্ত অবজেক্ট [] অ্যারে)
আগাদ

টিএক্স ... হ্যাঁ, আমি ৪.১ ব্যবহার করছি তবে এখনও আমার SuppressWarnings( unchecked )মতো লাইনের সাথে একটি Map<String, String> dummy = MapUtils.putAll(new HashMap<String, String>(), new Object[][]... )
মাইক রডেন্ট

@ মাইক্রোডেন্ট এটি অবজেক্টের কারণে নয় [] [] ? আপডেট হওয়া আনওয়্যার দেখুন - Eclipse এ আমার কোনও সতর্কতা নেই।
আগাদ

কত অদ্ভুত ... আমি গিয়েও String[][]"সতর্কতা" পাই! এবং অবশ্যই এটি কেবল যদি আপনার Kএবং Vএকই শ্রেণীর হয় তবে কাজ করে। আমি এটি গ্রহণ করেছি আপনি (অনুধাবনযোগ্য) আপনার গ্রহগ্রন্থ সেটআপে "চেনা চেক করা রূপান্তর" সেটাকে "উপেক্ষা করুন" তে সেট করেন নি?
মাইকে রডেন্ট

7

আমি যখন পেয়ারা ব্যবহার করতে চাই না (বা না করতে পারি) ImmutableMap.of()বা আমার যদি কোনও পরিবর্তনীয় প্রয়োজন হয় তবে এখানে আমার প্রিয় Map:

public static <A> Map<String, A> asMap(Object... keysAndValues) {
    return new LinkedHashMap<String, A>() {{
        for (int i = 0; i < keysAndValues.length - 1; i++) {
            put(keysAndValues[i].toString(), (A) keysAndValues[++i]);
        }
    }};
}

এটি খুব কমপ্যাক্ট এবং এটি বিপথগামী মানগুলিকে উপেক্ষা করে (অর্থাত্ একটি মান ছাড়াই একটি চূড়ান্ত কী)।

ব্যবহার:

Map<String, String> one = asMap("1stKey", "1stVal", "2ndKey", "2ndVal");
Map<String, Object> two = asMap("1stKey", Boolean.TRUE, "2ndKey", new Integer(2));

7

আপনি যদি অমার্ঘ্যযোগ্য মানচিত্র চান, অবশেষে জাভা 9 ইন্টারফেসে একটি দুর্দান্ত কারখানা পদ্ধতি যুক্ত ofকরেছে Map। অনুরূপ পদ্ধতিটি সেট, তালিকায়ও যুক্ত করা হয়।

Map<String, String> unmodifiableMap = Map.of("key1", "value1", "key2", "value2");


6

বেনাম ক্লাস তৈরি করা এড়াতে আমি একটি স্ট্যাটিক ইনিশিয়ালাইজার ব্যবহার পছন্দ করি (যার কোনও উদ্দেশ্য নেই), তাই আমি স্ট্যাটিক ইনিশিয়ালাইজারের সাহায্যে টিপস সূচনা করব। সমস্ত তালিকাভুক্ত সমাধান / টিপস টাইপ-নিরাপদ।

দ্রষ্টব্য: মানচিত্রটি অবিস্মরণীয় করার বিষয়ে প্রশ্নটি কিছু বলছে না, তাই আমি এটিকে ছেড়ে দেব, তবে জেনে রাখুন যে এটি সহজেই সম্পন্ন করা যায় Collections.unmodifiableMap(map)

প্রথম টিপ

1 ম টিপটি হ'ল আপনি মানচিত্রে একটি স্থানীয় রেফারেন্স তৈরি করতে পারেন এবং আপনি এটিকে একটি ছোট নাম দিন:

private static final Map<Integer, String> myMap = new HashMap<>();
static {
    final Map<Integer, String> m = myMap; // Use short name!
    m.put(1, "one"); // Here referencing the local variable which is also faster!
    m.put(2, "two");
    m.put(3, "three");
}

দ্বিতীয় টিপ

২ য় টিপটি হ'ল আপনি এন্ট্রি যুক্ত করতে একটি সহায়ক পদ্ধতি তৈরি করতে পারেন; আপনি যদি চান তবে এই সহায়ক পদ্ধতিটি সর্বজনীনও করতে পারেন:

private static final Map<Integer, String> myMap2 = new HashMap<>();
static {
    p(1, "one"); // Calling the helper method.
    p(2, "two");
    p(3, "three");
}

private static void p(Integer k, String v) {
    myMap2.put(k, v);
}

এখানে সহায়ক পদ্ধতিটি পুনরায় ব্যবহারযোগ্য নয় যদিও এটি কেবলমাত্র উপাদানগুলিকে যুক্ত করতে পারে myMap2। এটিকে পুনরায় ব্যবহারযোগ্য করে তোলার জন্য, আমরা মানচিত্রটিকে সহায়ক সহায়ক পদ্ধতির একটি পরামিতি বানাতে পারি, তবে আরম্ভের কোডটি আরও ছোট হবে না orter

তৃতীয় টিপ

3 য় টিপটি হ'ল আপনি জন কার্যকারীতা সহ পুনরায় ব্যবহারযোগ্য বিল্ডারের মতো সহায়ক শ্রেণি তৈরি করতে পারেন। এটি সত্যিই একটি সরল, 10-লাইনের সহায়ক শ্রেণি যা টাইপ-নিরাপদ:

public class Test {
    private static final Map<Integer, String> myMap3 = new HashMap<>();
    static {
        new B<>(myMap3)   // Instantiating the helper class with our map
            .p(1, "one")
            .p(2, "two")
            .p(3, "three");
    }
}

class B<K, V> {
    private final Map<K, V> m;

    public B(Map<K, V> m) {
        this.m = m;
    }

    public B<K, V> p(K k, V v) {
        m.put(k, v);
        return this; // Return this for chaining
    }
}

5

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

এটি বলার পরে, যতক্ষণ আপনি সচেতন হন তবে এই পদ্ধতিটি ঠিক আছে। আমি সংক্ষিপ্ত ফ্যাশনে সব ধরণের সংগ্রহ শুরু করার জন্য এটি বেশিরভাগ সময় ব্যবহার করি।

সম্পাদনা করুন: মন্তব্যগুলিতে সঠিকভাবে নির্দেশিত হয়েছে যে এটি একটি স্ট্যাটিক বর্গ। স্পষ্টতই আমি এটিকে খুব কাছাকাছিভাবে পড়িনি। তবে আমার মন্তব্য না এখনো বেনামী ভেতরের শ্রেণীর ক্ষেত্রে প্রযোজ্য।


3
এই বিশেষ ক্ষেত্রে এটি স্থির, সুতরাং বাইরের কোনও উদাহরণ নেই।
টম হাটিন - ২২ শে

তর্কসাপেক্ষ XStream ভালো ধারাবাহিকভাবে কাপড় বের করার চেষ্টা করা উচিত নয় (এটা এর স্ট্যাটিক কেন তুমি একটি স্ট্যাটিক পরিবর্তনশীল ধারাবাহিকভাবে করার প্রয়োজন হবে।?)
jasonmp85

5

আপনি যদি জ্বলজ্বল এবং তুলনামূলকভাবে নিরাপদ কিছু চান, আপনি কেবল রান-টাইমে সংকলন-টাইম চেকিং শিফট করতে পারেন:

static final Map<String, Integer> map = MapUtils.unmodifiableMap(
    String.class, Integer.class,
    "cat",  4,
    "dog",  2,
    "frog", 17
);

এই প্রয়োগে কোনও ত্রুটি ধরা উচিত:

import java.util.HashMap;

public abstract class MapUtils
{
    private MapUtils() { }

    public static <K, V> HashMap<K, V> unmodifiableMap(
            Class<? extends K> keyClazz,
            Class<? extends V> valClazz,
            Object...keyValues)
    {
        return Collections.<K, V>unmodifiableMap(makeMap(
            keyClazz,
            valClazz,
            keyValues));
    }

    public static <K, V> HashMap<K, V> makeMap(
            Class<? extends K> keyClazz,
            Class<? extends V> valClazz,
            Object...keyValues)
    {
        if (keyValues.length % 2 != 0)
        {
            throw new IllegalArgumentException(
                    "'keyValues' was formatted incorrectly!  "
                  + "(Expected an even length, but found '" + keyValues.length + "')");
        }

        HashMap<K, V> result = new HashMap<K, V>(keyValues.length / 2);

        for (int i = 0; i < keyValues.length;)
        {
            K key = cast(keyClazz, keyValues[i], i);
            ++i;
            V val = cast(valClazz, keyValues[i], i);
            ++i;
            result.put(key, val);
        }

        return result;
    }

    private static <T> T cast(Class<? extends T> clazz, Object object, int i)
    {
        try
        {
            return clazz.cast(object);
        }
        catch (ClassCastException e)
        {
            String objectName = (i % 2 == 0) ? "Key" : "Value";
            String format = "%s at index %d ('%s') wasn't assignable to type '%s'";
            throw new IllegalArgumentException(String.format(format, objectName, i, object.toString(), clazz.getSimpleName()), e);
        }
    }
}

4

জাভা 8 এর সাথে আমি নিম্নলিখিত প্যাটার্নটি ব্যবহার করতে এসেছি:

private static final Map<String, Integer> MAP = Stream.of(
    new AbstractMap.SimpleImmutableEntry<>("key1", 1),
    new AbstractMap.SimpleImmutableEntry<>("key2", 2)
).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

এটি সর্বাধিক পরিশ্রমী এবং কিছুটা চক্র নয়, তবে but

  • এটি বাইরে কিছু প্রয়োজন হয় না java.util
  • এটি টাইপসেফ এবং কী এবং মানের জন্য সহজেই বিভিন্ন ধরণের সংস্থান করে।

প্রয়োজনে toMapমানচিত্রের ধরণ উল্লেখ করার জন্য মানচিত্র সরবরাহকারী সহ স্বাক্ষর ব্যবহার করতে পারেন ।
zrvan

4

আপনি শুধুমাত্র মানচিত্রের আপনি ব্যবহার করতে পারেন এক মান যোগ করার প্রয়োজন হলে Collections.singletonMap :

Map<K, V> map = Collections.singletonMap(key, value)


4

আপনার দ্বিতীয় পদ্ধতির (ডাবল ব্রেস সূচনা) একটি বিরোধী নিদর্শন বলে মনে করা হয় , তাই আমি প্রথম পদ্ধতির দিকে যাব।

স্থিতিশীল মানচিত্রের আরম্ভ করার সহজ উপায় হ'ল এই ইউটিলিটি ফাংশনটি ব্যবহার করে:

public static <K, V> Map<K, V> mapOf(Object... keyValues) {
    Map<K, V> map = new HashMap<>(keyValues.length / 2);

    for (int index = 0; index < keyValues.length / 2; index++) {
        map.put((K)keyValues[index * 2], (V)keyValues[index * 2 + 1]);
    }

    return map;
}

Map<Integer, String> map1 = mapOf(1, "value1", 2, "value2");
Map<String, String> map2 = mapOf("key1", "value1", "key2", "value2");

দ্রষ্টব্য: Java 9আপনি Map.of ব্যবহার করতে পারেন


3

আমি স্ট্যাটিক ইনিশিয়ালাইজার সিনট্যাক্স পছন্দ করি না এবং আমি বেনামে সাবক্লাসে বিশ্বাসী নই। সাধারণত, আমি স্ট্যাটিক ইনিশিয়ালাইজার ব্যবহারের সমস্ত বিপরীতে এবং প্রিভিয়াস উত্তরে উল্লিখিত অজ্ঞাতনামা সাবক্ল্যাস ব্যবহার করার সমস্ত কনসের সাথে একমত। অন্যদিকে - এই পোস্টগুলিতে উপস্থাপনাগুলি আমার পক্ষে যথেষ্ট নয়। আমি স্ট্যাটিক ইনিশিয়ালাইজেশন পদ্ধতিটি ব্যবহার করতে পছন্দ করি:

public class MyClass {
    private static final Map<Integer, String> myMap = prepareMap();

    private static Map<Integer, String> prepareMap() {
        Map<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "one");
        hashMap.put(2, "two");

        return hashMap;
    }
}

3

আমি কোনও উত্তর পোস্ট করার পদ্ধতিটি ব্যবহার করি না (এবং পছন্দ করতে বেড়েছি) দেখিনি, সুতরাং এটি এখানে:

আমি স্ট্যাটিক ইনিশিয়ালাইজারগুলি ব্যবহার করতে পছন্দ করি না কারণ এগুলি চতুর, এবং আমি বেনামে ক্লাস পছন্দ করি না কারণ এটি প্রতিটি উদাহরণের জন্য একটি নতুন বর্গ তৈরি করছে।

পরিবর্তে, আমি সূচনাটি পছন্দ করি যা দেখতে এরকম দেখাচ্ছে:

map(
    entry("keyA", "val1"),
    entry("keyB", "val2"),
    entry("keyC", "val3")
);

দুর্ভাগ্যক্রমে, এই পদ্ধতিগুলি স্ট্যান্ডার্ড জাভা লাইব্রেরির অংশ নয়, সুতরাং আপনাকে নীচের পদ্ধতিগুলি সংজ্ঞায়িত করে একটি ইউটিলিটি লাইব্রেরি তৈরি করতে (বা ব্যবহার করতে হবে):

 public static <K,V> Map<K,V> map(Map.Entry<K, ? extends V>... entries)
 public static <K,V> Map.Entry<K,V> entry(K key, V val)

(আপনি পদ্ধতির নামের উপসর্গের প্রয়োজন এড়াতে 'আমদানি স্থিতি' ব্যবহার করতে পারেন)

অন্যান্য সংগ্রহের জন্য অনুরূপ স্থিতিশীল পদ্ধতি সরবরাহের জন্য আমি দরকারী বলে মনে করেছি (তালিকা, সেট, सॉোর্টসেট, सॉোর্টড ম্যাপ, ইত্যাদি)

এটি জসন অবজেক্ট ইনিশিয়ালেশনের মতো যথেষ্ট সুন্দর নয়, তবে পঠনযোগ্যতার দিক থেকে এটি দিকের এক ধাপ।


3

যেহেতু জাভা মানচিত্রের আক্ষরিক সমর্থন করে না, মানচিত্রের দৃষ্টান্তগুলি সর্বদা স্পষ্টভাবে তাত্ক্ষণিকভাবে এবং জনবসতিযুক্ত হতে হবে।

ভাগ্যক্রমে, কারখানার পদ্ধতি ব্যবহার করে জাভাতে মানচিত্রের আক্ষরিক আচরণের অনুমান করা সম্ভব ।

উদাহরণ স্বরূপ:

public class LiteralMapFactory {

    // Creates a map from a list of entries
    @SafeVarargs
    public static <K, V> Map<K, V> mapOf(Map.Entry<K, V>... entries) {
        LinkedHashMap<K, V> map = new LinkedHashMap<>();
        for (Map.Entry<K, V> entry : entries) {
            map.put(entry.getKey(), entry.getValue());
        }
        return map;
    }
    // Creates a map entry
    public static <K, V> Map.Entry<K, V> entry(K key, V value) {
        return new AbstractMap.SimpleEntry<>(key, value);
    }

    public static void main(String[] args) {
        System.out.println(mapOf(entry("a", 1), entry("b", 2), entry("c", 3)));
    }
}

আউটপুট:

{a = 1, খ = 2, সি = 3

মানচিত্রটি একবারে একটি উপাদান তৈরি এবং জনসাধারণের তুলনায় অনেক বেশি সুবিধাজনক।


2

জেপ 269 সংগ্রহ API এর জন্য কিছু সুবিধাজনক কারখানার পদ্ধতি সরবরাহ করে। এই কারখানার পদ্ধতিগুলি বর্তমান জাভা সংস্করণে নেই, যা 8 টি, তবে জাভা 9 রিলিজের জন্য পরিকল্পনা করা হয়েছে।

কারণ Mapএখানে দুটি কারখানা পদ্ধতি রয়েছে: ofএবং ofEntries। ব্যবহার করে of, আপনি বিকল্প কী / মান জোড়া পাস করতে পারেন। উদাহরণস্বরূপ, একটি Mapপছন্দ তৈরি করতে {age: 27, major: cs}:

Map<String, Object> info = Map.of("age", 27, "major", "cs");

বর্তমানে এর জন্য দশটি ওভারলোড হওয়া সংস্করণ রয়েছে of, সুতরাং আপনি দশটি কী / মান জোড়া যুক্ত একটি মানচিত্র তৈরি করতে পারেন। আপনি যদি এই সীমাবদ্ধতা বা বিকল্প কী / মানগুলি পছন্দ না করেন তবে আপনি ব্যবহার করতে পারেন ofEntries:

Map<String, Object> info = Map.ofEntries(
                Map.entry("age", 27),
                Map.entry("major", "cs")
);

উভয়ই ofএবং ofEntriesএক অপরিবর্তনীয় ফিরিয়ে দেবে Map, সুতরাং আপনি নির্মাণের পরে তাদের উপাদানগুলি পরিবর্তন করতে পারবেন না। আপনি JDK 9 প্রাথমিক অ্যাক্সেস ব্যবহার করে এই বৈশিষ্ট্যগুলি ব্যবহার করে দেখতে পারেন ।


2

ভাল ... আমি এনাম পছন্দ করি;)

enum MyEnum {
    ONE   (1, "one"),
    TWO   (2, "two"),
    THREE (3, "three");

    int value;
    String name;

    MyEnum(int value, String name) {
        this.value = value;
        this.name = name;
    }

    static final Map<Integer, String> MAP = Stream.of( values() )
            .collect( Collectors.toMap( e -> e.value, e -> e.name ) );
}

2

আমি উত্তরগুলি পড়েছি এবং আমি নিজের মানচিত্রের নির্মাতাকে লেখার সিদ্ধান্ত নিয়েছি। অনুলিপি অনুলিপি-পেস্ট করুন এবং উপভোগ করুন।

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * A tool for easy creation of a map. Code example:<br/>
 * {@code MapBuilder.of("name", "Forrest").and("surname", "Gump").build()}
 * @param <K> key type (inferred by constructor)
 * @param <V> value type (inferred by constructor)
 * @author Vlasec (for http://stackoverflow.com/a/30345279/1977151)
 */
public class MapBuilder <K, V> {
    private Map<K, V> map = new HashMap<>();

    /** Constructor that also enters the first entry. */
    private MapBuilder(K key, V value) {
        and(key, value);
    }

    /** Factory method that creates the builder and enters the first entry. */
    public static <A, B> MapBuilder<A, B> mapOf(A key, B value) {
        return new MapBuilder<>(key, value);
    }

    /** Puts the key-value pair to the map and returns itself for method chaining */
    public MapBuilder<K, V> and(K key, V value) {
        map.put(key, value);
        return this;
    }

    /**
     * If no reference to builder is kept and both the key and value types are immutable,
     * the resulting map is immutable.
     * @return contents of MapBuilder as an unmodifiable map.
     */
    public Map<K, V> build() {
        return Collections.unmodifiableMap(map);
    }
}

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

সম্পাদনা 2: আরও সাম্প্রতিককালে, আমি আর স্ট্যাটিক পদ্ধতি ofহিসাবে পছন্দ করি না , কারণ স্থির আমদানি ব্যবহার করার সময় এটি দেখতে বেশ খারাপ লাগে। mapOfস্থির আমদানির জন্য আরও উপযুক্ত করে আমি এর পরিবর্তে এর নামকরণ করেছি ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.