এনামগুলি কী এবং সেগুলি কেন কার্যকর?


488

আজ আমি এই সাইটে কয়েকটি প্রশ্নের মাধ্যমে ব্রাউজ করছিলাম এবং আমি এই জাতীয় সমাধানের জন্য থ্রেড সুরক্ষা সুবিধাগুলি সম্পর্কে enum সিঙ্গলটন প্যাটার্নে ব্যবহৃত হবার একটি উল্লেখ পেয়েছি ।

আমি কখনই এর ব্যবহার করিনি enumএবং আমি কয়েক বছরেরও বেশি সময় ধরে জাভাতে প্রোগ্রামিং করছি। এবং স্পষ্টতই তারা অনেক পরিবর্তন হয়েছিল। এখন তারা নিজের মধ্যে ওওপির পূর্ণ বর্ধিত সমর্থনও করে।

এখন কেন এবং কী জন্য আমার প্রতিদিনের প্রোগ্রামিংয়ে এনাম ব্যবহার করা উচিত?




আপনি এনামগুলি ইনস্ট্যান্ট করতে পারবেন না কারণ এটির ব্যক্তিগত নির্মাণকারী রয়েছে, তারা jvm স্টার্টআপে ইনস্ট্যান্ট করা হয়, সুতরাং এটির সিঙ্গলটন, এনামগুলি থ্রেড নিরাপদ নয়।
অরনাভ জোশী

উত্তর:


633

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

আপনি যদি পূর্ণসংখ্যার পরিবর্তে (বা স্ট্রিং কোডগুলি) এনাম ব্যবহার করেন তবে আপনি সংকলন-সময় পরীক্ষা বাড়াতে এবং অবৈধ স্থিরকারীগুলিতে পাস করা ত্রুটিগুলি এড়াতে পারবেন এবং কোন মানটি ব্যবহার করার জন্য আইনী তা ডকুমেন্ট করুন।

বিটিডাব্লু, এনামগুলির অত্যধিক ব্যবহারের অর্থ হতে পারে যে আপনার পদ্ধতিগুলি খুব বেশি করে (প্রায়শই একাধিক পতাকা গ্রহণের পরিবর্তে পৃথক পৃথক পদ্ধতি থাকা ভাল যা এটি কী করে তা পরিবর্তন করে) তবে আপনার যদি পতাকা বা টাইপ কোডগুলি ব্যবহার করতে হয় তবে এনামগুলি যাবার উপায়

উদাহরণ হিসাবে, কোনটি ভাল?

/** Counts number of foobangs.
 * @param type Type of foobangs to count. Can be 1=green foobangs,
 * 2=wrinkled foobangs, 3=sweet foobangs, 0=all types.
 * @return number of foobangs of type
 */
public int countFoobangs(int type)

বনাম

/** Types of foobangs. */
public enum FB_TYPE {
 GREEN, WRINKLED, SWEET, 
 /** special type for all types combined */
 ALL;
}

/** Counts number of foobangs.
 * @param type Type of foobangs to count
 * @return number of foobangs of type
 */
public int countFoobangs(FB_TYPE type)

একটি পদ্ধতি কল যেমন:

int sweetFoobangCount = countFoobangs(3);

তারপরে হয়ে যায়:

int sweetFoobangCount = countFoobangs(FB_TYPE.SWEET);

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

int sweetFoobangCount = countFoobangs(99);

আর সম্ভব হয় না।


41
যদি আপনি এনাম ব্যবহার করেন এবং মানগুলির সংমিশ্রণের অনুমতি দিতে চান তবে এনামসেট ব্যবহার করুন। এটি পাবলিক স্ট্যাটিক ফাইনাল এনামসেট <FB_TYPE> ALL = EnumSet.allOf (FB_TYPE.class) এর মতো সমস্ত ধরণের ঝরঝরে সহায়তাকারীর সাথে আসে;
রবউউ

20
এই উত্তরগুলি হ'ল আমি সত্যিই এসও তে দেখতে পছন্দ করি কারণ কেউ এর মধ্যে সত্যিকারের প্রচেষ্টা চালিয়েছে, ভাল চাকরি আমি এখন এনামগুলিকে বুঝতে পারি!
উত্সর্গীকৃত

1
আমি এটি সত্য মনে করি না you should *always* use enums when a variable can only take one out of a small set of possible values। 'বাইনারি পতাকা' হিসাবে ধ্রুবক মানগুলি ব্যবহার করা (লজিক্যাল orইনিং সহ) রিয়েল টাইম অ্যাপ্লিকেশনগুলির জন্য দরকারী হতে পারে যেখানে আপনি স্মৃতিশক্তি কম আছেন।
এলিস্ট

@ এনাম ব্যবহারের তালিকা আপনার কোডগুলির পাঠযোগ্যতা বৃদ্ধি করে, আপনি যদি কিছু সময় ধ্রুবক ব্যবহার করেন তবে আপনি বা আপনার উত্তরসূরি জানেন না কেন এটি ব্যবহৃত হচ্ছে ...:)
রুট

136

কোনও প্রোগ্রামিং ভাষার বৈশিষ্ট্য কেন ব্যবহার করবেন? আমাদের যেহেতু ভাষা আছে সেটির কারণ

  1. প্রোগ্রামারগণ দক্ষতার সাথে এবং সঠিকভাবে আলগোরিদিমগুলি প্রকাশ করতে একটি ফর্ম কম্পিউটার ব্যবহার করতে পারেন।
  2. অন্যদের অ্যালগরিদম বোঝার জন্য রক্ষণাবেক্ষণকারীরা লিখেছেন এবং সঠিকভাবে পরিবর্তন করেছেন।

এনামগুলি প্রচুর বয়লারপ্লেট না লিখে নির্ভুলতা এবং পাঠযোগ্যতার উভয় সম্ভাবনা উন্নত করে। আপনি যদি বয়লারপ্লেট লিখতে ইচ্ছুক হন তবে আপনি এনামগুলিকে "অনুকরণ" করতে পারেন:

public class Color {
    private Color() {} // Prevent others from making colors.
    public static final Color RED = new Color();
    public static final Color AMBER = new Color();
    public static final Color GREEN = new Color();
}

এখন আপনি লিখতে পারেন:

Color trafficLightColor = Color.RED;

উপরের বয়লারপ্লেটের মতো একই প্রভাব রয়েছে

public enum Color { RED, AMBER, GREEN };

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

এটি কমপক্ষে আরও একটি কারণেও সার্থক:

বিবৃতি পরিবর্তন করুন

static finalউপরের এনাম সিমুলেশনটি আপনাকে দেয় না এমন একটি জিনিস হ'ল সুন্দর switchক্ষেত্রে। এনাম প্রকারের জন্য, জাভা স্যুইচটি এনামের মামলার পরিধি নির্ধারণ করতে তার পরিবর্তনশীলের প্রকারটি ব্যবহার করে, সুতরাং উপরেরগুলির জন্য enum Colorআপনাকে কেবল বলা দরকার:

Color color = ... ;
switch (color) {
    case RED:
        ...
        break;
}

নোট করুন এটি Color.REDক্ষেত্রে হয় না। আপনি যদি এনাম ব্যবহার না করেন তবে নামযুক্ত পরিমাণ ব্যবহারের একমাত্র উপায় switchহ'ল:

public Class Color {
    public static final int RED = 0;
    public static final int AMBER = 1;
    public static final int GREEN = 2;
}

তবে এখন রঙ ধারণ করতে একটি ভেরিয়েবলের প্রকারটি অবশ্যই থাকতে হবে int। এনাম এবং static finalসিমুলেশনটির দুর্দান্ত সংকলক চেকিং শেষ। অসুখী.

একটি আপস হ'ল সিমুলেশনে কোনও স্কেলারের মূল্যবান সদস্য ব্যবহার করা:

public class Color {
    public static final int RED_TAG = 1;
    public static final int AMBER_TAG = 2;
    public static final int GREEN_TAG = 3;

    public final int tag;

    private Color(int tag) { this.tag = tag; } 
    public static final Color RED = new Color(RED_TAG);
    public static final Color AMBER = new Color(AMBER_TAG);
    public static final Color GREEN = new Color(GREEN_TAG);
}

এখন:

Color color = ... ;
switch (color.tag) {
    case Color.RED_TAG:
        ...
        break;
}

তবে খেয়াল করুন, আরও বয়লারপ্লেট!

সিঙ্গেলটন হিসাবে একটি এনাম ব্যবহার করা

উপরের বয়লারপ্লেট থেকে আপনি দেখতে পাচ্ছেন যে কেন একটি এনাম একটি সিঙ্গলটন বাস্তবায়নের জন্য একটি উপায় সরবরাহ করে। লেখার পরিবর্তে:

public class SingletonClass {
    public static final void INSTANCE = new SingletonClass();
    private SingletonClass() {}

    // all the methods and instance data for the class here
}

এবং তারপরে এটি অ্যাক্সেস করা

SingletonClass.INSTANCE

আমরা শুধু বলতে পারি

public enum SingletonClass {
    INSTANCE;

    // all the methods and instance data for the class here
}

যা আমাদের একই জিনিস দেয়। আমরা এই দিয়ে পার পেতে পারে না, কারণ জাভা enums হয় শুধুমাত্র একটি সামান্য অন্বিত উপরের উপর সিঁচিত চিনি সঙ্গে পূর্ণ শ্রেণীর হিসাবে প্রয়োগ করা। এটি আবার কম বয়লারপ্লেট তবে আইডিয়ামটি আপনার পরিচিত না হলে এটি স্পষ্ট নয়। আমিও যে আপনি বিভিন্ন enum ফাংশন পেতে যদিও তারা Singleton জন্য অনেক মানে হয় না অপছন্দ: ordএবং values, ইত্যাদি (আছে আসলে একটি, trickier সিমুলেশন কোথায় Color extends Integerযে সুইচ সঙ্গে কাজ করবে, কিন্তু এটা যাতে চতুর এটা যে আরও বেশি কেন enumএকটি ভাল ধারণা তা স্পষ্টভাবে দেখায় ))

থ্রেড সুরক্ষা

থ্রেড সুরক্ষা কেবল তখনই সম্ভাব্য সমস্যা যখন সিলেটলেটগুলি অলসভাবে লক না করে তৈরি করা হয়।

public class SingletonClass {
    private static SingletonClass INSTANCE;
    private SingletonClass() {}
    public SingletonClass getInstance() {
        if (INSTANCE == null) INSTANCE = new SingletonClass();
        return INSTANCE;
    }

    // all the methods and instance data for the class here
}

এখনও যদি শূন্য থাকা getInstanceঅবস্থায় অনেক থ্রেড একই সাথে কল করে তবে INSTANCEযে কোনও সংখ্যক উদাহরণ তৈরি করা যেতে পারে। এইটা খারাপ. synchronizedচলকটি রক্ষা করতে একমাত্র সমাধান হ'ল অ্যাক্সেস যুক্ত করা INSTANCE

তবে static finalউপরের কোডটিতে এই সমস্যা নেই। এটি ক্লাস লোডের সময়টি আগ্রহের সাথে তৈরি করে। শ্রেণি লোড সিঙ্ক্রোনাইজ করা হয়।

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


15
এই শেষ অনুচ্ছেদটি সত্যই আমার জন্য সিঙ্গলটনের পরিস্থিতি স্পষ্ট করেছে। ধন্যবাদ! যে কোনও পাঠক যে স্কিমিং করছে তা পুনরায় পড়তে হবে।
তুলসী বাউর্ক

আমি এটি পড়ছিলাম, স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / ১6777১1373৩/২ । এখন আমি আপনার শেষ প্যারা নিয়ে বিভ্রান্ত হয়ে পড়েছি। এনাম কীভাবে প্রাথমিক স্তর বৈশিষ্ট্য সরবরাহ করে না?
দীপঙ্কর সিংহ

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

42

ইতিমধ্যে উল্লিখিত ব্যবহারের ক্ষেত্রেগুলি ছাড়াও, আমি প্রায়শই কিছু বেসিক ওওপি গাইডলাইন অনুসরণ করে কৌশল প্যাটার্ন বাস্তবায়নের জন্য এনামগুলিকে দরকারী বলে মনে করি:

  1. ডেটা রয়েছে এমন কোড থাকা (এটি হ'ল এনামের মধ্যে - বা প্রায়শই এনাম কনস্ট্যান্টের মধ্যে থাকে, যা পদ্ধতিগুলিকে ওভাররাইড করতে পারে)।
  2. এনামের সাথে ক্লায়েন্ট কোডটি আবদ্ধ না করার জন্য একটি ইন্টারফেস (বা আরও) প্রয়োগ করা হচ্ছে (এটি কেবলমাত্র ডিফল্ট প্রয়োগের একটি সেট সরবরাহ করতে পারে)।

সবচেয়ে সহজ উদাহরণ হ'ল Comparatorবাস্তবায়নগুলির একটি সেট :

enum StringComparator implements Comparator<String> {
    NATURAL {
        @Override
        public int compare(String s1, String s2) {
            return s1.compareTo(s2);
        }
    },
    REVERSE {
        @Override
        public int compare(String s1, String s2) {
            return NATURAL.compare(s2, s1);
        }
    },
    LENGTH {
        @Override
        public int compare(String s1, String s2) {
            return new Integer(s1.length()).compareTo(s2.length());
        }
    };
}

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

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


2
আপনি যোগ করতে পারে CASE_INSENSITIVE { @Override public int compare(String s1, String s2) { return s1.compareToIgnoreCase(s2); }। এখনও উল্লেখ না করা একটি সুবিধা হ'ল আপনি একটি শক্তিশালী সিরিয়ালাইজেশন সমর্থন পান; অবিচ্ছিন্ন ফর্মটিতে কেবলমাত্র শ্রেণীর নাম এবং ধ্রুবক নাম থাকে, আপনার তুলনাকারীদের কোনও প্রয়োগের বিশদ নির্ভর করে না।
হলগার

32

অন্যান্য উত্তরগুলির মধ্যে কোনওটিই কভার করেনি যা এনামগুলিকে বিশেষভাবে শক্তিশালী করে তোলে টেম্পলেট পদ্ধতি রাখার ক্ষমতা । পদ্ধতিগুলি বেস এনুমের অংশ হতে পারে এবং প্রতিটি ধরণের দ্বারা ওভাররাইড করা যায়। এবং এনামের সাথে আচরণের সাথে, এটি প্রায়শই যদি এই ব্লগ পোস্টটি দেখায় যে বিবৃতি তৈরি করে বা সুইচ স্টেটমেন্টগুলির প্রয়োজনীয়তা সরিয়ে দেয় - enum.method()শর্তাধীন অভ্যন্তরে মূলত কার্যকর করা হবে কোথায় would একই উদাহরণটি এনামগুলির সাথে স্থিতিশীল আমদানির ব্যবহারের পাশাপাশি কোডের মতো অনেক ক্লিনার ডিএসএল উত্পাদনও দেখায়।

অন্যান্য বেশ কয়েকটি আকর্ষণীয় গুণাবলী সত্য যে enums জন্য বাস্তবায়ন প্রদান অন্তর্ভুক্ত equals(), toString()এবং hashCode()এবং বাস্তবায়ন Serializableএবং Comparable

যে সমস্ত এনামগুলিকে অফার করতে হবে তার সম্পূর্ণ পাল্টে ফেলার জন্য আমি জাভা ৪ র্থ সংস্করণে ব্রুস একেলের থিংকিংয়ের জন্য অত্যন্ত পরামর্শ দিচ্ছি যা পুরো বিষয়টিকে পুরো অধ্যায়টি উত্সর্গ করে। বিশেষত আলোকসজ্জা হ'ল এনক হিসাবে রক, পেপার, কাঁচি (অর্থাত্ রোশামবো) গেম জড়িত examples


23

জাভা নথি থেকে -

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

একটি সাধারণ উদাহরণ হ'ল এনুম টাইপের সাথে প্রাইভেট স্ট্যাটিক ফাইনাল ইনট কনস্ট্যান্টস (কনস্ট্যান্টের যুক্তিসঙ্গত সংখ্যার মধ্যে) একটি সেট সহ কোনও শ্রেণি প্রতিস্থাপন করা। মূলত আপনি যদি মনে করেন যে আপনি সংকলনের সময় "কিছু" এর সমস্ত সম্ভাব্য মান জানেন তবে আপনি এটিকে এনাম টাইপ হিসাবে উপস্থাপন করতে পারেন। এনামগুলি ধ্রুবক সহ একটি শ্রেণীর উপর পাঠযোগ্যতা এবং নমনীয়তা সরবরাহ করে।

এনাম ধরণের সম্পর্কে আমি ভাবতে পারি এমন আরও কয়েকটি সুবিধা। এগুলি সর্বদা একটি নির্দিষ্ট এনাম শ্রেণীর একটি উদাহরণ (তাই সিঙ্গলটন আসার সাথে সাথে এনামগুলি ব্যবহারের ধারণা)। আরেকটি সুবিধা হ'ল আপনি এনামগুলিকে একধরণের সুইচ-কেস স্টেটমেন্ট হিসাবে ব্যবহার করতে পারেন। এছাড়াও আপনি এনামে টু স্ট্রিং () ব্যবহারযোগ্য স্ট্রিং হিসাবে মুদ্রণ করতে ব্যবহার করতে পারেন ।


8
আপনি বছরের 366 দিনের জন্য কোনও এনাম ব্যবহার করবেন? এটি স্থির একটি স্থির সেট (366) (দিনগুলি পরিবর্তন হচ্ছে না)। সুতরাং এটি আপনার উচিত পরামর্শ দেয়। : - / আমি স্থির সেটটির আকার সীমাবদ্ধ করতাম।
মoinনুদিন

2
@ মার্ককগ কিছুটা চালাক চিন্তাভাবনা সহ একটি কমপ্যাক এনামে প্রতি সপ্তাহে এবং কয়েক মাসের সংক্ষিপ্তসারগুলি পাওয়া যেতে পারে।
জেমস পি।

1
সপ্তাহের দিনের কথা বলতে গেলে… DayOfWeekএনাম এখন পূর্ব-সংজ্ঞায়িত, জাভা 8 এ নির্মিত এবং পরে জাভা.টাইম ফ্রেমওয়ার্কের অংশ হিসাবে (এবং জাভা 6 এবং 7 এবং অ্যান্ড্রয়েডে ব্যাক- পোর্টড )।
বেসিল বাউরক

19

এখন কেন এবং কী জন্য আমার প্রতিদিনের প্রোগ্রামিংয়ে এনাম ব্যবহার করা উচিত?

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

উদাহরণস্বরূপ: আপনি সমস্ত পূর্ণসংখ্যার পরিবর্তে বিভাজক যুক্ত করার সময় কোনও আইডিইতে প্রদর্শিত মানগুলির নির্দিষ্ট সেট ব্যবহারের Locale.setDefault(Locale.US)চেয়ে আরও ভাল পড়েন Locale.setDefault(1)এবং কার্যকর করেন .


@ আর্ট আমি প্রশ্নটিতে ব্যাকরণও ঠিক করেছি। ধন্যবাদ।
জেমস পি।

13

Enumএকটি স্ব-ডকুমেন্টিং উপায়ে মানগুলির একটি নির্দিষ্ট সেট গণনা করুন।
এগুলি আপনার কোডটিকে আরও স্পষ্ট করে তোলে এবং ত্রুটি-প্রবণতাও কম করে।

কেন ধ্রুবকগুলির জন্য String, বা intপরিবর্তে , ব্যবহার করছেন না Enum?

  1. সংকলক টাইপসকে মঞ্জুরি দেয় না, মান নির্ধারিত সেটের বাইরে দেয় না , কারণ এনামগুলি নিজেরাই টাইপ করে। ফল:
    • আপনার যুক্তি বৈধ পরিসরে রয়েছে তা নিশ্চিত করতে আপনাকে কোনও প্রাক-শর্ত (বা একটি ম্যানুয়াল if) লিখতে হবে না ।
    • টাইপ পরিবর্তিত বিনামূল্যে জন্য আসে।
  2. এনামদের আচরণ যেমন অন্য কোনও শ্রেণীর মতো হতে পারে।
  3. Stringযাইহোক, সম্ভবত এটির জন্য আপনার একই পরিমাণের মেমরির প্রয়োজন হবে (এটি এর জটিলতার উপর নির্ভর করে Enum)।

তদতিরিক্ত, এর প্রতিটি Enumউদাহরণ হ'ল একটি শ্রেণি, যার জন্য আপনি এর স্বতন্ত্র আচরণকে সংজ্ঞায়িত করতে পারেন।

এছাড়াও, তারা উদাহরণগুলি তৈরি করার সময় থ্রেড সুরক্ষার নিশ্চয়তা দেয় (যখন এনাম বোঝাই হয়), যা সিঙ্গলটন প্যাটার্নকে সহজ করার ক্ষেত্রে দুর্দান্ত প্রয়োগ দেখেছে ।

এই ব্লগটি এর কিছু অ্যাপ্লিকেশন চিত্রিত করে, যেমন পার্সারের জন্য রাজ্য মেশিন


13

এটি জেনে রাখা দরকারী যে ক্ষেত্রগুলি enumsসহ অন্যান্য শ্রেণীর মতো Constantএবং এ private constructor

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

public enum Weekday
{
  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
} 

সংকলক নীচে এটি সংকলন করে;

class Weekday extends Enum
{
  public static final Weekday MONDAY  = new Weekday( "MONDAY",   0 );
  public static final Weekday TUESDAY = new Weekday( "TUESDAY ", 1 );
  public static final Weekday WEDNESDAY= new Weekday( "WEDNESDAY", 2 );
  public static final Weekday THURSDAY= new Weekday( "THURSDAY", 3 );
  public static final Weekday FRIDAY= new Weekday( "FRIDAY", 4 );
  public static final Weekday SATURDAY= new Weekday( "SATURDAY", 5 );
  public static final Weekday SUNDAY= new Weekday( "SUNDAY", 6 );

  private Weekday( String s, int i )
  {
    super( s, i );
  }

  // other methods...
}

12

enumমানে এনাম ইরেশন অর্থাৎ একের পর এক উল্লেখ করা (বেশ কয়েকটি জিনিস)।

একটি এনাম একটি ডাটা টাইপ যা স্থির সেটগুলির সেট থাকে।

অথবা

একটি enumঠিক classএকটির মতো, সংকলনের সময় নির্দিষ্ট দৃষ্টান্তের একটি সেট সহ set

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

public class EnumExample {
    interface SeasonInt {
        String seasonDuration();
    }

    private enum Season implements SeasonInt {
        // except the enum constants remaining code looks same as class
        // enum constants are implicitly public static final we have used all caps to specify them like Constants in Java
        WINTER(88, "DEC - FEB"), SPRING(92, "MAR - JUN"), SUMMER(91, "JUN - AUG"), FALL(90, "SEP - NOV");

        private int days;
        private String months;

        Season(int days, String months) { // note: constructor is by default private 
            this.days = days;
            this.months = months;
        }

        @Override
        public String seasonDuration() {
            return this+" -> "+this.days + "days,   " + this.months+" months";
        }

    }
    public static void main(String[] args) {
        System.out.println(Season.SPRING.seasonDuration());
        for (Season season : Season.values()){
            System.out.println(season.seasonDuration());
        }

    }
}

এনামের সুবিধা:

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

আরও জন্য


9

এনাম কী

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

কেন এনাম ব্যবহার করবেন

  • এনামগুলি স্পষ্টতই java.lang.Enum এর চূড়ান্ত সাবক্লাস
  • যদি এনাম কোনও শ্রেণীর সদস্য হয় তবে তা স্পষ্টতই স্থির
  • নতুন কখনই এনামের সাথে ব্যবহার করা যায় না, এমনকি এনাম টাইপের মধ্যেও
  • নাম এবং মানফল কেবল এনাম ধ্রুবকের পাঠ্য ব্যবহার করুন, যখন টুস্ট্রিং কোনও সামগ্রী সরবরাহ করতে ওভাররাইড করা যেতে পারে, যদি ইচ্ছা হয়
  • এনাম ধ্রুবকগুলির জন্য, সমান এবং == একই জিনিসের পরিমাণ এবং বিনিময়যোগ্য হিসাবে ব্যবহার করা যেতে পারে
  • এনাম ধ্রুবকগুলি স্পষ্টতই পাবলিক স্ট্যাটিক ফাইনাল

বিঃদ্রঃ

  • এনামগুলি কোনও শ্রেণি বাড়িয়ে দিতে পারে না।
  • একটি এনাম একটি সুপার ক্লাস হতে পারে না।
  • এনাম ধ্রুবকগুলির উপস্থিতির ক্রমটিকে তাদের "প্রাকৃতিক আদেশ" বলা হয় এবং অন্যান্য আইটেমগুলির দ্বারা ব্যবহৃত ক্রমও সংজ্ঞায়িত করা হয়: তুলনাটো, মানগুলির পুনরাবৃত্তির ক্রম, এনামসেট, এনামসেট.রেঞ্জ।
  • একটি গণনায় কনস্ট্রাক্টর, স্ট্যাটিক এবং ইনস্ট্যান্স ব্লক, ভেরিয়েবল এবং পদ্ধতি থাকতে পারে তবে বিমূর্ত পদ্ধতি থাকতে পারে না।

4
এনামগুলি কেন ব্যবহার করবেন তা আপনি ব্যাখ্যা করেন না। আপনি কেবল সম্পর্কযুক্ত শিরোনামের নীচে এনামগুলির বেশ কয়েকটি বৈশিষ্ট্য তালিকাভুক্ত করেন।
ডানকান জোন্স

@ ডানকনজোনস শর্তাবলী চূড়ান্ত, স্থির নয় কি এনাম ব্যবহারের উদ্দেশ্য দেয়?
tinker_fairy

8

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

enum ProtocolType {
    TCP_IP (1, "Transmission Control Protocol"), 
    IP (2, "Internet Protocol"), 
    UDP (3, "User Datagram Protocol");

    public int code;
    public String name;

    private ProtocolType(int code, String name) {
        this.code = code;
        this.name = name;
    }

    public static ProtocolType fromInt(int code) {
    switch(code) {
    case 1:
        return TCP_IP;
    case 2:
        return IP;
    case 3:
        return UDP;
    }

    // we had some exception handling for this
    // as the contract for these was between 2 independent applications
    // liable to change between versions (mostly adding new stuff)
    // but keeping it simple here.
    return null;
    }
}

enumলগতে ProtocolType.fromInt(2) লিখতে ব্যবহার করে প্রাপ্ত মানগুলি (যেমন 1,2) থেকে অবজেক্ট তৈরি করুনmyEnumObj.name

আশাকরি এটা সাহায্য করবে.


6

এনাম Objectক্লাস এবং বিমূর্ত শ্রেণীর সমস্ত পদ্ধতি উত্তরাধিকার সূত্রে পায় Enum। সুতরাং আপনি প্রতিবিম্ব, মাল্টিথ্রিডিং, সেরিলাইজেশন, তুলনামূলক ইত্যাদি জন্য এর পদ্ধতিগুলি ব্যবহার করতে পারেন যদি আপনি এনুমের পরিবর্তে কোনও স্থির ধ্রুবক ঘোষণা করেন তবে আপনি পারবেন না। তদ্ব্যতীত, এনুমের মান ডিএও স্তরকেও দেওয়া যেতে পারে।

এখানে প্রদর্শনের জন্য একটি উদাহরণ প্রোগ্রাম।

public enum State {

    Start("1"),
    Wait("1"),
    Notify("2"),
    NotifyAll("3"),
    Run("4"),
    SystemInatilize("5"),
    VendorInatilize("6"),
    test,
    FrameworkInatilize("7");

    public static State getState(String value) {
        return State.Wait;
    }

    private String value;
    State test;

    private State(String value) {
        this.value = value;
    }

    private State() {
    }

    public String getValue() {
        return value;
    }

    public void setCurrentState(State currentState) {
        test = currentState;
    }

    public boolean isNotify() {
        return this.equals(Notify);
    }
}

public class EnumTest {

    State test;

    public void setCurrentState(State currentState) {
        test = currentState;
    }

    public State getCurrentState() {
        return test;
    }

    public static void main(String[] args) {
        System.out.println(State.test);
        System.out.println(State.FrameworkInatilize);
        EnumTest test=new EnumTest();
        test.setCurrentState(State.Notify);
        test. stateSwitch();
    }

    public void stateSwitch() {
        switch (getCurrentState()) {
        case Notify:
            System.out.println("Notify");
            System.out.println(test.isNotify());
            break;
        default:
            break;
        }
    }
}

4

এনাম এর অর্থ "গণিত প্রকার"। এটি এমন একটি ডেটা টাইপ যা আপনার নিজের দ্বারা সংজ্ঞায়িত একটি ধ্রুবক সেট থাকে।


আপনি কেন এনাম ব্যবহার করবেন তা ব্যাখ্যা করেননি।
ডানকান জোন্স

4
হ্যা, আমি করেছিলাম. আপনি নিজেকে নির্ধারিত স্থির সেটগুলির সঞ্চয় করতে এটি ব্যবহার করেন। এর নির্দিষ্ট প্রয়োগটি আপনার উপর নির্ভর করে to কখন, কেন, কীভাবে কোনও জিনিস ব্যবহার করবেন তা বলার মতো বিষয় নেই। এটি বিকাশকারীদের প্রয়োজন অনুসারে। আপনাকে যা বোঝার দরকার তা হ'ল এটি কী এবং এটি কীভাবে কাজ করে।
স্টিভ

4

আমার মতে, আপনি এখন পর্যন্ত যে উত্তরগুলি পেয়েছেন তা বৈধ, তবে আমার অভিজ্ঞতায় আমি এটিকে কয়েকটি কথায় প্রকাশ করব:

আপনি যদি শনাক্তকারীর মানটির বৈধতা পরীক্ষা করতে সংকলকটি চান তবে এনামগুলি ব্যবহার করুন।

অন্যথায়, আপনি সর্বদা যেমন স্ট্রিং ব্যবহার করতে পারেন (সম্ভবত আপনি আপনার অ্যাপ্লিকেশনটির জন্য কিছু "কনভেনশন" সংজ্ঞায়িত করেছেন) এবং আপনি খুব নমনীয় হবেন ... তবে আপনি আপনার স্ট্রিংয়ের টাইপগুলির বিরুদ্ধে 100% সুরক্ষা পাবেন না এবং আপনি কেবল সেগুলি উপলব্ধি করতে পারবেন রানটাইমে


3

টাইপ সুরক্ষার জন্য এনাম ব্যবহার করুন, এটি একটি ভাষা বৈশিষ্ট্য যাতে আপনি সাধারণত পাবেন:

  • সংকলক সমর্থন (অবিলম্বে টাইপ সমস্যা দেখুন)
  • আইডিইগুলিতে সরঞ্জাম সমর্থন (স্যুইচ ক্ষেত্রে স্বয়ংক্রিয়ভাবে সমাপ্তি, নিখোঁজ মামলাগুলি, ফোর্স ডিফল্ট, ...)
  • কিছু ক্ষেত্রে এনাম পারফরম্যান্সও দুর্দান্ত ( এনামসেট , প্রথাগত অন্তর্নিহিত "বিট ফ্ল্যাগগুলির বিকল্পের টাইপসেফের বিকল্প ) "

এনামগুলিতে পদ্ধতি থাকতে পারে, নির্মাতারা থাকতে পারে, আপনি এমনকি এনামগুলির অভ্যন্তরে এনাম ব্যবহার করতে পারেন এবং এনটাকে ইন্টারফেসের সাথে একত্র করতে পারেন।

এনটগুলিকে টাইম হিসাবে ভাবেন ইন্ট কনস্ট্যান্টগুলির একটি ভাল সংজ্ঞায়িত সেট (যা জাভা সি / সি ++ থেকে 'উত্তরাধিকার সূত্রে প্রাপ্ত') এবং কিছু ক্ষেত্রে বিট ফ্ল্যাগগুলি প্রতিস্থাপন করতে পারে।

কার্যকর জাভা 2 য় সংস্করণ বইটি তাদের সম্পর্কে একটি সম্পূর্ণ অধ্যায় রয়েছে এবং আরও বিশদে। এছাড়াও এই স্ট্যাক ওভারফ্লো পোস্টটি দেখুন


2

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

enums coffeesize{BIG , HUGE , OVERWHELMING }; 
//This semicolon is optional.

এই পরিমিত coffeesizeপারেন না থাকার করুন: BIG, HUGE, অথবা OVERWHELMINGএকটি পরিবর্তনশীল হিসাবে।


2

Enum? কেন এটি ব্যবহার করা উচিত? আমার মনে হয় আপনি কখন এটি ব্যবহার করবেন এটি আরও বোঝা গেছে। আমি একই অভিজ্ঞতা আছে।

বলুন আপনার কাছে একটি তৈরি, মুছুন, সম্পাদনা করুন এবং ডেটাবেস অপারেশন পড়েছেন।

এখন আপনি যদি একটি অপারেশন হিসাবে একটি এনাম তৈরি করেন:

public enum operation {
    create("1")
    delete("2")
    edit("3")
    read("4")

    // You may have is methods here
    public boolean isCreate() {
        return this.equals(create);
    }
    // More methods like the above can be written

}

এখন, আপনি এর মতো কিছু ঘোষণা করতে পারেন:

private operation currentOperation;

// And assign the value for it 
currentOperation = operation.create

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

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


1

এখনও অবধি আমার কখনই এনাম ব্যবহার করার দরকার পড়েনি। আমি তাদের সম্পর্কে পড়ছি যেহেতু সেগুলিকে আবার ডেকে আনা হয়েছিল বলে 1.5 বা সংস্করণ বাঘে পরিচয় হয়েছিল। তারা সত্যিই আমার জন্য কোনও 'সমস্যা' সমাধান করেনি। যারা এটি ব্যবহার করেন (এবং আমি তাদের অনেকগুলি দেখি) তাদের পক্ষে নিশ্চিত যে এটি অবশ্যই কোনও উদ্দেশ্যে কাজ করে। শুধু আমার 2 কুইড।


1

এখানে অনেক উত্তর রয়েছে, কেবল দুটি নির্দিষ্ট উত্তর নির্দেশ করতে চাই:

1) Switch-caseবিবৃতিতে ধ্রুবক হিসাবে ব্যবহার করা । স্যুইচ কেস আপনাকে ক্ষেত্রে স্ট্রিং অবজেক্ট ব্যবহার করতে দেয় না। এনামরা কাজে আসে। আরও: http://www.javabeat.net/2009/02/how-to-use-enum-in-switch/

2) বাস্তবায়ন Singleton Design Pattern- পুনরায় এনাম, উদ্ধার করতে আসে। ব্যবহার, এখানে: জাভাতে এনামকে সিঙ্গেলটন হিসাবে ব্যবহারের জন্য সর্বোত্তম পন্থাটি কী?


1

আমাকে আহ-হা মুহুর্তটি কী দিয়েছে তা এই উপলব্ধিটি ছিল: এনুমের একটি ব্যক্তিগত নির্মাণকারীর জনসাধারণের গণনা দ্বারা কেবল অ্যাক্সেসযোগ্য:

enum RGB {
    RED("Red"), GREEN("Green"), BLUE("Blue");

    public static final String PREFIX = "color ";

    public String getRGBString() {
        return PREFIX + color;
    }

    String color;

    RGB(String color) {
        this.color = color;
    }
}

public class HelloWorld {
    public static void main(String[] args) {
        String c = RGB.RED.getRGBString();
        System.out.print("Hello " + c);
    }
}

1

ভবিষ্যতে কোডটি পঠনযোগ্য করে তোলার জন্য, পরবর্তী স্নিপকেটে গণনার সবচেয়ে কার্যকর প্রয়োগযোগ্য কেস উপস্থাপন করা হয়েছে:

public enum Items {
    MESSAGES, CHATS, CITY_ONLINE, FRIENDS, PROFILE, SETTINGS, PEOPLE_SEARCH, CREATE_CHAT
}

@Override
public boolean onCreateOptionsMenu(Menu menuPrm) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menuPrm);
    View itemChooserLcl;
    for (int i = 0; i < menuPrm.size(); i++) {
        MenuItem itemLcl  = menuPrm.getItem(i);
            itemChooserLcl = itemLcl.getActionView();
            if (itemChooserLcl != null) {
                 //here Im marking each View' tag by enume values:
                itemChooserLcl.setTag(Items.values()[i]);
                itemChooserLcl.setOnClickListener(drawerMenuListener);
            }
        }
    return true;
}
private View.OnClickListener drawerMenuListener=new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Items tagLcl= (Items) v.getTag();
        switch (tagLcl){
            case MESSAGES: ;
            break;
            case CHATS : ;
            break;
            case CITY_ONLINE : ;
            break;
            case FRIENDS : ;
            break;
            case  PROFILE: ;
            break;
            case  SETTINGS: ;
            break;
            case  PEOPLE_SEARCH: ;
            break;
            case  CREATE_CHAT: ;
            break;
        }
    }
};

1

আমার অভিজ্ঞতায় আমি দেখেছি এনুম ব্যবহার কখনও কখনও সিস্টেমগুলিকে পরিবর্তন করা খুব কঠিন করে তোলে। আপনি যদি ডোমেন-সুনির্দিষ্ট মানগুলির ঘন ঘন পরিবর্তনের জন্য একটি এনাম ব্যবহার করে থাকেন এবং এর উপর অন্যান্য অনেকগুলি শ্রেণি এবং উপাদান রয়েছে যা আপনি নির্ভর করেন তবে আপনি এনুম ব্যবহার না করার বিষয়টি বিবেচনা করতে পারেন ।

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

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

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


1

এনাম বেসড সিঙ্গলটন

একটি পুরানো সমস্যা একটি আধুনিক চেহারা

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

public enum Singleton {
    SINGLETON; 
    public void method() { }
}

কিভাবে কাজ করে? ঠিক আছে, কোডের দুটি লাইন এই জাতীয় কিছুতে বিবেচনা করা যেতে পারে:

public final static Singleton SINGLETON = new Singleton(); 

এবং আমরা ভাল পুরানো প্রাথমিক আরম্ভকৃত সিঙ্গলটন পাই।

মনে রাখবেন যেহেতু এটি একটি এনাম তাই আপনি সর্বদা উদাহরণের মাধ্যমেও অ্যাক্সেস করতে পারবেন Singleton.INSTANCE:

Singleton s = Singleton.INSTANCE;
সুবিধাদি
  • ডিসিরিয়ালাইজেশনের সময় সিঙ্গেলনের আরও একটি উদাহরণ তৈরি করা রোধ করতে এনএম বেসড সিঙ্গেলটন ব্যবহার করুন কারণ এনভিয়ের সিরিয়ালাইজেশন জেভিএম দ্বারা যত্ন নেওয়া হয়। এনাম সিরিয়ালাইজেশন এবং ডিসারায়ালাইজেশন সাধারণ জাভা অবজেক্টের চেয়ে আলাদাভাবে কাজ করে। সিরিয়ালযুক্ত হয়ে যাওয়া একমাত্র জিনিসটি এনাম মানের নাম। Deserialization প্রক্রিয়া চলাকালীন এনুম পদ্ধতিটি valueOfdeserialized নামের সাথে কাঙ্ক্ষিত উদাহরণ পেতে ব্যবহৃত হয়।
  • এনাম ভিত্তিক সিঙ্গলটন প্রতিবিম্বের আক্রমণ থেকে নিজেকে রক্ষা করতে দেয়। এনাম টাইপটি আসলে জাভা Enumক্লাসকে প্রসারিত করে । এনাম ধরণের বস্তুগুলি প্রতিবিম্বিত করার জন্য প্রতিবিম্বটি ব্যবহার করা যায় না কারণ জবা স্পেসিফিকেশনটিকে বারণ করা হয় না এবং এই নিয়মটি শ্রেণীর newInstanceপদ্ধতি প্রয়োগের ক্ষেত্রে কোড করা হয় Constructor, যা সাধারণত প্রতিবিম্বের মাধ্যমে অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয়:
if ((clazz.getModifiers() & Modifier.ENUM) != 0)
    throw new IllegalArgumentException("Cannot reflectively create enum objects");
  • এনুম ক্লোন করার কথা নয় কারণ প্রতিটি মানের অবশ্যই এক উদাহরণ থাকতে হবে।
  • সমস্ত একক উপলব্ধির মধ্যে সর্বাধিক লকনিক কোড।
অসুবিধেও
  • এনাম ভিত্তিক সিঙ্গলটন অলস প্রারম্ভিককরণের অনুমতি দেয় না।
  • আপনি যদি নিজের নকশা পরিবর্তন করেন এবং আপনার সিঙ্গলটনকে মাল্টিটনে রূপান্তর করতে চান তবে এনাম এটিকে অনুমতি দেবে না। মাল্টিটন প্যাটার্নটি একাধিক ইনস্ট্যান্সের নিয়ন্ত্রিত তৈরির জন্য ব্যবহৃত হয়, এটি এটি ব্যবহার করে পরিচালনা করে mapঅ্যাপ্লিকেশন প্রতি একক উদাহরণ থাকার চেয়ে (উদাহরণস্বরূপ java.lang.Runtime) মাল্টিটন প্যাটার্ন পরিবর্তে কী প্রতি একক উদাহরণ নিশ্চিত করে ।
  • এনাম কেবল জাভা 5 এ প্রদর্শিত হবে যাতে আপনি এটি পূর্ববর্তী সংস্করণে ব্যবহার করতে পারবেন না।

সুবিধা এবং অসুবিধাগুলির সাথে একেকটি একক প্যাটার্নের বেশ কয়েকটি উপলব্ধি রয়েছে।

  • আগ্রহী লোডিং সিঙ্গলটন
  • ডাবল-চেকড লকিং সিঙ্গলটন
  • ইনিশিয়েশন-অন-ডিমান্ড হোল্ডার প্রতিমা
  • এনাম বেসড সিঙ্গলটন

তাদের প্রত্যেকটির বিশদ বিবরণ খুব ভার্জোজ যার ফলে আমি কেবল একটি ভাল নিবন্ধে একটি লিঙ্ক রেখেছি - আপনি সিঙ্গেলটন সম্পর্কে যা জানতে চান


0

আমি কার্যকরভাবে ম্যাপিংয়ের উপকরণ হিসাবে এনামগুলিকে ব্যবহার করব, একাধিক বিষয় এড়িয়ে যাব if-else যে কয়েকটি পদ্ধতি প্রয়োগ করা হয়েছে।

public enum Mapping {

    ONE("1"),
    TWO("2");

    private String label;

    private Mapping(String label){
        this.label = label;
    }

    public static Mapping by(String label) {

        for(Mapping m: values() {
            if(m.label.equals(label)) return m;
        }

        return null;
    }

}

সুতরাং পদ্ধতিটি by(String label)আপনাকে গণনাবিহীন দ্বারা গণিত মান পেতে দেয়। আরও, 2 টি এনামের মধ্যে ম্যাপিংটি আবিষ্কার করতে পারে। 'এক থেকে এক' ডিফল্ট সম্পর্ক ছাড়াও '1 থেকে বহু' বা 'অনেকের কাছে' অনেক চেষ্টা করতে পারে

শেষ পর্যন্ত, enumএকটি জাভা ক্লাস। সুতরাং mainএটির অভ্যন্তরে আপনার কোনও পদ্ধতি থাকতে পারে যা এই মুহুর্তে কিছু ম্যাপিং ক্রিয়াকলাপ করার প্রয়োজন হলে কার্যকর হতে পারে args


0

পরিবর্তে কনট ইন্ট ডিক্লেয়ারেশনগুলির একগুচ্ছ করা

আপনি তাদের 1 টি এনামে গ্রুপ করতে পারেন

সুতরাং এগুলি সমস্ত তাদের দ্বারা পরিচালিত সাধারণ গোষ্ঠী দ্বারা সংগঠিত


0

এনামগুলি ক্লাসের মতো। শ্রেণীর মতো এটিরও পদ্ধতি এবং বৈশিষ্ট্য রয়েছে।

শ্রেণীর সাথে পার্থক্যগুলি: ১. এনাম ধ্রুবকগুলি সর্বজনীন, স্থির, চূড়ান্ত। ২. একটি এনাম কোনও বস্তু তৈরি করতে ব্যবহার করা যায় না এবং এটি অন্যান্য শ্রেণি প্রসারিত করতে পারে না। তবে এটি ইন্টারফেস প্রয়োগ করতে পারে।


0

@ ব্র্যাডবি ছাড়াও উত্তর:

এটি এতটাই সত্য ... এটি আশ্চর্যজনক যে এটির উত্তরটিই কেবল এটিই বলে। নতুনরা যখন এনামগুলি আবিষ্কার করেন, তারা দ্রুত এটি সংকলকটির বৈধ সনাক্তকারী সনাক্তকরণের জন্য যাদু কৌশল হিসাবে গ্রহণ করে। এবং যখন কোডটি বিতরণ করা সিস্টেমে ব্যবহারের উদ্দেশ্যে করা হয়, তারা কাঁদছে ... কয়েক মাস পরে। এনামগুলির সাথে পশ্চাদগম সামঞ্জস্যতা বজায় রাখা যাতে মানগুলির স্থির তালিকা থাকে না এটি আসল উদ্বেগ, এবং ব্যথা। এটি কারণ যখন আপনি বিদ্যমান এনুমে কোনও মান যুক্ত করেন, তখন এর ধরণের পরিবর্তন (নাম সত্ত্বেও না)।

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

উপসংহারে: আপনি যখন চান তখন এটি ব্যবহার করুন তবে দয়া করে পরীক্ষা করুন যে ব্যবহৃত ডেটা ডোমেনটি সীমাবদ্ধ, ইতিমধ্যে পরিচিত, স্থির সেট

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