পাবলিক স্ট্যাটিক ফাইনাল ফিল্ডসের সাথে ক্লাস বনাম জাভা এনামের সুবিধা কী?


147

আমি সি # এর সাথে খুব পরিচিত কিন্তু জাভাতে আরও কাজ শুরু করি। আমি জেনে প্রত্যাশা করলাম যে জাভাতে এনামগুলি মূলত সি # এর সমতুল্য ছিল তবে দৃশ্যত এটি তেমন নয়। প্রাথমিকভাবে আমি জানতে পেরেছিলাম যে জাভা এনামগুলিতে একাধিক উপাত্ত থাকতে পারে যা খুব সুবিধাজনক বলে মনে হয় ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html )। যাইহোক, তখন থেকে আমি অনেকগুলি বৈশিষ্ট্য হারিয়েছি যা সি # তে তুচ্ছ, যেমন একটি এনাম উপাদান সহজেই একটি নির্দিষ্ট মান নির্ধারণের ক্ষমতা এবং ফলস্বরূপ একটি শালীন পরিমাণের প্রচেষ্টা ছাড়াই একটি পূর্ণসংখ্যাকে একটি এনামে রূপান্তর করার ক্ষমতা ( অর্থ্যাৎ জাভা এনুমের সাথে মেলে পূর্ণসংখ্যার মান রূপান্তর করুন )।

সুতরাং আমার প্রশ্নটি হ'ল: গুচ্ছ পাবলিক স্ট্যাটিক চূড়ান্ত ক্ষেত্রগুলির সাথে একটি শ্রেণি জুড়ে জাভা এনামসের কোনও লাভ আছে কি? অথবা এটি কি আরও কমপ্যাক্ট সিনট্যাক্স সরবরাহ করে?

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

public static final Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
public static final Planet VENUS = new Planet(4.869e+24, 6.0518e6);
public static final Planet EARTH = new Planet(5.976e+24, 6.37814e6);
public static final Planet MARS = new Planet(6.421e+23, 3.3972e6);
public static final Planet JUPITER = new Planet(1.9e+27, 7.1492e7);
public static final Planet SATURN = new Planet(5.688e+26, 6.0268e7);
public static final Planet URANUS = new Planet(8.686e+25, 2.5559e7);
public static final Planet NEPTUNE = new Planet(1.024e+26, 2.4746e7);

যতদূর আমি বলতে পারি, ক্যাসাব্ল্যাঙ্কার উত্তরটি কেবল এটিই সন্তুষ্ট করে।


4
@ বোহেমিয়ান: এটি ডুপ্লিকেট নাও হতে পারে, যেহেতু ওপি কেবলমাত্র public static finalক্ষেত্রগুলিকেই উল্লেখ করেছে , যেগুলি মান টাইপ করা যেতে পারে এবং অগত্যা নয় int
ক্যাসাব্ল্যাঙ্কা

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

1
@ খুব হ্যাঁ আমি জানতাম যে সেখানে মতবিরোধ হবে। এবং এখানে 49 সেকেন্ডের মধ্যে একটি is এনামগুলি দুর্দান্ত (এবং আমি তাদের খুব পছন্দ করি এবং এগুলি প্রায়শই ব্যবহার করি) তবে ধ্রুবক ঘোষণার সময় বা এটি ব্যবহার করার সময় আপনার কী ধরণের সুরক্ষার প্রয়োজন। স্ট্রিং আক্ষরিকের জন্য ধ্রুবক ঘোষণার জন্য প্রত্যেকবার এনাম তৈরি করা একটি ওভারকিল।
শাহজেব

4
@ শাহজেব আপনার যদি একটি একক পরিবর্তনশীল থাকে তবে অবশ্যই একটি স্ট্রিং ব্যবহার করুন, এখানে খুব বেশি কিছু ঘটতে পারে না (একক মান প্যারামিটার হিসাবে বরং অর্থহীন)। তবে মনে রাখবেন যে আমরা ধ্রুবক সম্পর্কে কথা বলছি S, সুতরাং এখন আমরা সম্ভবত সেগুলি ফাংশনগুলিতে প্রেরণের বিষয়ে কথা বলছি we আমাদের কি টাইপ-সাফটি দরকার ? ভাল, না, তবে বেশিরভাগ লোক সি-স্টাইলের ধরণের "সবকিছু void*" একটি ভাল স্টাইল বিবেচনা করে এবং এটি বাগগুলি থামাতে পারে (বিশেষত যদি একাধিক এনাম / স্ট্রিং প্যারামিটার পাস করে!)। এছাড়াও এটি ধ্রুবকগুলিকে তাদের নিজের নাম ইত্যাদির মধ্যে রাখে that বিপরীতে, কেবল সরল ভেরিয়েবলগুলি পাওয়ার কোনও সত্যিকারের সুবিধা নেই।
ভু

3
@ বোহেমিয়ান: আমি কীভাবে তা দেখছি না। সঙ্গে intগুলি, কোন প্রকার নিরাপত্তা কারণ এক কোনো মান পাস পারে। অন্যদিকে, টাইপযুক্ত বস্তুগুলি সুরক্ষা প্রকারের দিক থেকে এনাম থেকে আলাদা নয়।
ক্যাসাব্ল্যাঙ্কা

উত্তর:


78

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


14
এছাড়াও রয়েছে .values()মূল্যবোধের তালিকা পুনরুক্তি।
এইচ

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

7
@ ক্রাগ করুন আপনার প্রবৃত্তিটি সঠিক - এটি একটি খুব খারাপ উত্তর, কারণ এটি enumsগুলির উদ্দেশ্যটি পুরোপুরি মিস করেছে। কারণগুলির অংশের জন্য প্রশ্নের অধীনে আমার মন্তব্যগুলি দেখুন।
বোহেমিয়ান

1
@ বোহেমিয়ান: আমি এনামগুলির "উদ্দেশ্য" মিস করিনি - আমি সেগুলি সর্বদা ব্যবহার করি। আপনার মন্তব্য উপর আমার প্রতিক্রিয়া দেখুন।
ক্যাসাব্ল্যাঙ্কা

1
Enum.valuesOf পদ্ধতিতে দু'বার ফোন করা হলে একই বস্তুটি ফিরে আসে?
এমরে আক্তার্ক

104
  1. সুরক্ষা এবং মান সুরক্ষা টাইপ করুন।
  2. গ্যারান্টিযুক্ত সিঙ্গলটন।
  3. পদ্ধতিগুলি সংজ্ঞায়িত ও ওভাররাইড করার ক্ষমতা।
  4. যোগ্যতা ছাড়াই switchবিবৃতি caseবিবৃতিতে মানগুলি ব্যবহার করার ক্ষমতা ।
  5. এর মাধ্যমে মানগুলির অন্তর্নির্মিত অনুক্রমিকরণ ordinal().
  6. নাম অনুসারে সিরিয়ালকরণ মান অনুসারে নয়, যা ভবিষ্যতের প্রুফিংয়ের একটি ডিগ্রি সরবরাহ করে।
  7. EnumSetএবং EnumMapক্লাস।

19
সব বলার পরে, আমি যখনই এনুমে কোড রেখেছি তখন আমি তার জন্য দুঃখ প্রকাশ করেছি।
লার্নের মারকুইস

4
কেন আফসোস করলেন? আমি কখনও করিনি ...
glglgl

2
@glglgl Becasue এটি অ্যাপ্লিকেশন-নির্দিষ্ট কোডটিকে এমন এক জায়গায় স্থাপন করেছে যেখানে আমি অনুভব করেছি যে এটি সত্যিকারের নয়, এটি কেবলমাত্র মূল্যবোধের সেটকে সংজ্ঞায়িত করেছিল। তাহলে আমি আবার কি ছিল আমি অনেক এক এটি অন্তর্ভুক্ত হবে switchবিবৃতি যে ব্যবহার করার জন্য মূল প্রেরণা ছিল Enumসব সময়ে।
লার্নের মারকুইস

72

কেউ তাদের switchবিবৃতিতে ব্যবহারের দক্ষতার কথা উল্লেখ করেনি ; আমি এটাও ফেলে দেব।

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


যাইহোক, আপনি এনাম বনাম স্ট্যাটিক ক্ষেত্রগুলির কোনও সুবিধা উল্লেখ করেন নি, আপনি স্ট্যাটিক ক্ষেত্রগুলি সহ স্যুইচ স্টেটমেন্টগুলিতে পর্যাপ্ত ধরনের ব্যবহার করতে পারেন।
ওপিকে

@ জেনাট সুবিধাটি হ'ল এনামগুলিতে স্ট্রিংয়ের চেয়ে বেশি কার্যকারিতা থাকে বা অন্তর্নিহিত প্রশ্নটি পার্থক্য সম্পর্কে, যা আমি সরবরাহ করি। এনপিএসগুলি কী কী তা ওপি ইতিমধ্যে অবগত রয়েছে এবং আমি যখন 4.5 বছর আগে এটি পোস্ট করেছি তখন অন্য কেউ সুইচ স্টেটমেন্টের কথা উল্লেখ করেনি, এবং কমপক্ষে কয়েক জন খুঁজে পেয়েছিল এটি নতুন তথ্য সরবরাহ করেছে ¯_ (ツ) _ / ¯
ডেভ নিউটন

44

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

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

public static final int SIZE_SMALL  = 1;
public static final int SIZE_MEDIUM = 2;
public static final int SIZE_LARGE  = 3;

public void setSize(int newSize) { ... }

obj.setSize(15); // Compiles but likely to fail later

বনাম

public enum Size { SMALL, MEDIUM, LARGE };

public void setSize(Size s) { ... }

obj.setSize( ? ); // Can't even express the above example with an enum

3
ক্লাসগুলিও নিরাপদ প্রকারের ...: / (স্ট্যাটিক ক্ষেত্র ধারক শ্রেণীর প্রকারের
ধার্য করে

আপনি এখনও এটি একটি অবৈধ মান পাস করতে পারেন তবে এটি একটি সংকলন সময় ত্রুটি হবে যা স্পষ্ট করা খুব সহজ।
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

2
আপনি setSize(null)আপনার দ্বিতীয় উদাহরণটিতে কল করতে পারেন , তবে এটি প্রথম উদাহরণের ত্রুটির চেয়ে খুব শীঘ্রই ব্যর্থ হওয়ার সম্ভাবনা রয়েছে।
জেফ্রি

42

কম বিভ্রান্তি আছে। Fontউদাহরণস্বরূপ নিন । এটিতে এমন একটি নির্মাণকারী রয়েছে যা Fontআপনি চান তার নাম , আকার এবং শৈলী ( new Font(String, int, int)) নেন । আজ অবধি আমি মনে করতে পারি না শৈলী বা আকারটি প্রথমে যায় কিনা। যদি Fontএকটি ব্যবহার করেছিল enumতার বিভিন্ন শৈলীর সকলের জন্য ( PLAIN, BOLD, ITALIC, BOLD_ITALIC), তার কন্সট্রাকটর মত দেখাবে Font(String, Style, int), কোনো ধরনের বিভ্রান্তির প্রতিরোধ। দুর্ভাগ্যক্রমে, ক্লাসটি তৈরি হওয়ার enumসময় এর আশেপাশে ছিল না Font, এবং যেহেতু জাভা বিপরীত সামঞ্জস্য বজায় রাখতে হবে, আমরা সবসময় এই অস্পষ্টতা দ্বারা জর্জরিত থাকব।

অবশ্যই, এটি কেবল ধ্রুবকগুলির enumপরিবর্তে ব্যবহার করার জন্য একটি যুক্তি public static final। Enums এছাড়াও জন্য উপযুক্ত singletons এবং ডিফল্ট আচরণ বাস্তবায়নে কিছু পরে স্বনির্ধারণ (আইই জন্য অনুমতি কৌশল প্যাটার্ন )। পরেরটির একটি উদাহরণ java.nio.files 'এর OpenOptionএবং StandardOpenOptionযদি একজন বিকাশকারী তার নিজের অ-মানক তৈরী করতে চান: OpenOptionতিনি পারা।


যদি একই এনামের দু'জনের কাছে জিজ্ঞাসা করা হয় তবে আপনার 'ফন্ট' কেসটি এখনও দ্ব্যর্থক। এই সমস্যার আধ্যাত্মিক উত্তর হ'ল বহু ভাষা নামযুক্ত পরামিতি বলে । এটি বা আরও ভাল আইডিই পদ্ধতি স্বাক্ষর সমর্থন।
aaaaaa

1
@ আআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআর এর এমন একসাথে অনেক ক্ষেত্রে দেখিনি যেখানে কোনও কনস্ট্রাক্টর ভারার্গস বা একটি স্বেচ্ছাসেবী সংখ্যার জন্য enumব্যবহার না করেই দুটিরকমSet গ্রহণ করবে।
জেফ্রে

@aaaaa নামযুক্ত পরামিতিগুলির মূল সমস্যাটি বাস্তবায়নের বিশদ (প্যারামিটারের নাম) এর উপর নির্ভর করে। আমি একটি ইন্টারফেস করতে পারেন interface Foo { public void bar(String baz); }। কেউ কেউ একটি বর্গ যা কিছুকে ডাকে, তোলে bar: someFoo.bar(baz = "hello");। আমি স্বাক্ষর পরিবর্তন Foo::barকরতে public void bar(String foobar)। এখন যিনি ফোন করেছেন someFooতাদের যদি এখনও কোডটি কাজ করতে চান তবে তাদের কোডটি পরিবর্তন করতে হবে।
জেফ্রে

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

26

এখানে অনেক ভাল উত্তর রয়েছে, তবে কেউ উল্লেখ করেননি যে বিশেষভাবে এনামদের জন্য সংগ্রহের এপিআই ক্লাস / ইন্টারফেসের অত্যন্ত অনুকূলিতকরণ বাস্তবায়ন রয়েছে :

এই এনাম নির্দিষ্ট ক্লাসগুলি কেবলমাত্র Enumদৃষ্টান্তগুলি গ্রহণ করে ( EnumMapকেবলমাত্র Enumকী হিসাবে কেবল গ্রহণ করে ) এবং যখনই সম্ভব হয় তারা তাদের প্রয়োগের ক্ষেত্রে সংক্ষিপ্ত প্রতিনিধিত্ব এবং বিট ম্যানিপুলেশনে ফিরে যায়।

এটার মানে কি?

যদি আমাদের Enumপ্রকারের আর elements৪ টি উপাদান থাকে না (বাস্তব জীবনের বেশিরভাগ Enumউদাহরণ এটির জন্য যোগ্য হবে), বাস্তবায়নগুলি উপাদানগুলিকে একক longমান হিসাবে সংরক্ষণ করে, প্রতিটি Enumপ্রশ্নের উত্তর এই -৪-বিট দীর্ঘের সাথে যুক্ত হবে long। একটি উপাদানের সাথে যুক্ত EnumSetকরা কেবলমাত্র যথাযথ বিটটি 1 এ সেট করা হয়, এটি সরানো কেবল সেই বিটটি 0 এ সেট করা হয় an যদি কোনও উপাদানটি Setকেবল একটি বিটমাস্ক পরীক্ষায় থাকে তবে পরীক্ষা করা হয়! এখন আপনি Enumএই জন্য প্রেম করতে হবে !


1
আমি এই দুটি সম্পর্কে আগে জানতাম, তবে আমি কেবল আপনার What does this mean?বিভাগ থেকে অনেক কিছু শিখেছি । আমি জানতাম যে
64৪

15

উদাহরণ:

public class CurrencyDenom {
   public static final int PENNY = 1;
 public static final int NICKLE = 5;
 public static final int DIME = 10;
public static final int QUARTER = 25;}

জাভা কনস্ট্যান্টের সীমাবদ্ধতা

1) কোনও প্রকার-সুরক্ষা নয় : প্রথমত এটি টাইপ-নিরাপদ নয়; আপনি যে কোনও বৈধ অন্তর্নির্ম মান ইন্টিগ্রাহ্য করতে পারেন 99 যেমন মানটির প্রতিনিধিত্ব করার কোনও মুদ্রা নেই।

2) অর্থপূর্ণ মুদ্রণ নয় : এই ধ্রুবকের যে কোনওটির মুদ্রণ মান মুদ্রার অর্থপূর্ণ নামের পরিবর্তে এর সংখ্যার মানটি মুদ্রণ করবে যেমন আপনি যখন নিকেল প্রিন্ট করবেন তখন এটি "নিকেল" এর পরিবর্তে "5" মুদ্রণ করবে

3) কোনও নামস্থান : মুদ্রা অ্যাক্সেসের জন্য ডেনম ধ্রুবকটি অবশ্যই শ্রেণীর নাম উপস্থাপন করা দরকার যেমন কারেন্সিডেনম.পেন্নি কেবল পেনি ব্যবহারের পরিবর্তে এটি জেডিকে 1.5 তে স্থির আমদানি ব্যবহার করে অর্জন করা যেতে পারে though

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

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

public enum Currency {PENNY, NICKLE, DIME, QUARTER};

Currency coin = Currency.PENNY; coin = 1; //compilation error

২) জাভাতে এনাম ক্লাস বা ইন্টারফেসের মতো রেফারেন্স টাইপ এবং আপনি জাভা এনুমের ভিতরে কনস্ট্রাক্টর, পদ্ধতি এবং ভেরিয়েবল সংজ্ঞায়িত করতে পারেন যা জাভা এনাম টাইপের পরবর্তী উদাহরণে দেখানো হিসাবে এটি এন এবং সি ++ এর তুলনায় আরও শক্তিশালী করে তোলে।

3) আপনি নীচের উদাহরণে যেমন দেখানো হয়েছে তেমন এনাম কনস্ট্যান্টের মান নির্দিষ্ট করতে পারেন: পাবলিক এনাম মুদ্রা {পেনি (1), নিক (4), সময় (10), কোয়ার্টার (25)}; তবে এটি কাজ করার জন্য আপনাকে সদস্য ভেরিয়েবল এবং কনস্ট্রাক্টর সংজ্ঞায়িত করতে হবে কারণ পেনি (১) আসলে এমন একটি কনস্ট্রাক্টরকে কল করছে যা ইনট মান গ্রহণ করে, নীচের উদাহরণটি দেখুন।

public enum Currency {
    PENNY(1), NICKLE(5), DIME(10), QUARTER(25);
    private int value;

    private Currency(int value) {
            this.value = value;
    }
}; 

তথ্যসূত্র: https://javarevisited.blogspot.com/2011/08/enum-in-java-example-tutorial.html


11

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

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

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

এটি কেবল জাভার ক্ষেত্রেই সত্য নয়, তবে কঠোর টাইপ-চেকিং সহ অন্যান্য ভাষার ক্ষেত্রেও। সি, সি ++, ডি, সি # ভাল উদাহরণ।


4

একটি enum, implictly চূড়ান্ত একটি প্রাইভেট কনস্ট্রাকটর সঙ্গে, তার সব মান একই ধরনের বা সাব-টাইপ হয়, আপনি তার সব মান ব্যবহার পেতে পারেন values(), তার পায় name()বা ordinal()মান বা আপনি নম্বর বা নাম দ্বারা একটি enum আপ করতে পারেন।

আপনি সাবক্লাসগুলি সংজ্ঞায়িতও করতে পারেন (এমনকি চূড়ান্তভাবে চূড়ান্ত হলেও এমন কিছু যা আপনি অন্য কোনও উপায়ে করতে পারবেন না)

enum Runner implements Runnable {
    HI {
       public void run() {
           System.out.println("Hello");
       }
    }, BYE {
       public void run() {
           System.out.println("Sayonara");
       }
       public String toString() {
           return "good-bye";
       }
    }
 }

 class MYRunner extends Runner // won't compile.

4

এনাম উপকারিতা:

  1. এনামগুলি টাইপ-নিরাপদ, স্থির ক্ষেত্রগুলি নয়
  2. সীমাবদ্ধ সংখ্যার মান রয়েছে (অস্তিত্বহীন এনাম মান পাস করা সম্ভব নয় you আপনার যদি স্থির শ্রেণীর ক্ষেত্র থাকে তবে আপনি সেই ভুলটি করতে পারেন)
  3. প্রতিটি এনামের একাধিক বৈশিষ্ট্য (ক্ষেত্র / getters) নির্ধারিত থাকতে পারে - এনক্যাপসুলেশন। এছাড়াও কিছু সাধারণ পদ্ধতি: YEAR.toSecond () বা অনুরূপ। তুলনা করুন: Colors.toHex (Colors.RED) এর সাথে Colors.RED.getHex ()

"যেমন সহজেই এনাম উপাদানকে একটি নির্দিষ্ট মান নির্ধারণের ক্ষমতা"

enum EnumX{
  VAL_1(1),
  VAL_200(200);
  public final int certainValue;
  private X(int certainValue){this.certainValue = certainValue;}
}

"এবং ফলস্বরূপ একটি শালীন পরিমাণের প্রচেষ্টা ছাড়াই একটি পূর্ণসংখ্যাকে একটি এনামে রূপান্তর করার ক্ষমতা" এটি এনামে রূপান্তরকারী একটি পদ্ধতি যুক্ত করুন যা এটি করে। কেবল ম্যাপিং জাভা এনাম যুক্ত স্ট্যাটিক হ্যাশম্যাপ <পূর্ণসংখ্যা, এনামএক্সএক্স> যুক্ত করুন ।

আপনি যদি সত্যিই অর্ড = VAL_200.ordinal () কে ভাল_200 এ রূপান্তর করতে চান তবে কেবল ব্যবহার করুন: এনামএক্সএলভ্যুইলস () [অর্ড]


3

আরেকটি গুরুত্বপূর্ণ পার্থক্য হল যে জাভা কম্পাইলার একইরূপে হয় static finalক্ষেত্র আদিম ধরনের এবং স্ট্রিং লিটারেল হিসাবে। এর অর্থ এই ধ্রুবকগুলি ইনলাইন হয়ে যায়। এটি C/C++ #defineপ্রিপ্রোসেসর এর অনুরূপ । দেখুন এই তাই প্রশ্ন । এনামদের ক্ষেত্রে এটি হয় না।



2

সর্বাধিক সুবিধা হ'ল এনাম সিঙ্গলেটনগুলি সহজেই লেখা এবং থ্রেড-নিরাপদ:

public enum EasySingleton{
    INSTANCE;
}

এবং

/**
* Singleton pattern example with Double checked Locking
*/
public class DoubleCheckedLockingSingleton{
     private volatile DoubleCheckedLockingSingleton INSTANCE;

     private DoubleCheckedLockingSingleton(){}

     public DoubleCheckedLockingSingleton getInstance(){
         if(INSTANCE == null){
            synchronized(DoubleCheckedLockingSingleton.class){
                //double checking Singleton instance
                if(INSTANCE == null){
                    INSTANCE = new DoubleCheckedLockingSingleton();
                }
            }
         }
         return INSTANCE;
     }
}

উভয়ই একই রকম এবং এটি প্রয়োগ করে নিজেরাই সিরিয়ালাইজেশন পরিচালনা করে

//readResolve to prevent another instance of Singleton
    private Object readResolve(){
        return INSTANCE;
    }

অধিক


0

আমি মনে করি enumএটি হতে পারে না final, কারণ হুড সংকলকটির অধীনে প্রতিটি enumপ্রবেশের জন্য সাবক্লাস তৈরি করা হয় ।

উত্স থেকে আরও তথ্য


অভ্যন্তরীণভাবে, এগুলি চূড়ান্ত নয়, কারণ - যেমন আপনি বলেছেন - অভ্যন্তরীণভাবে সাবক্ল্যাস করা যেতে পারে। তবে হায়, আপনি এগুলি নিজের হাতে সাবক্লাস করতে পারবেন না, যেমন নিজস্ব মান সহ এটি প্রসারিত করার জন্য।
glglgl

0

এনামগুলির অনেক সুবিধা রয়েছে যা এখানে পোস্ট করা হয়েছে, এবং আমি এখনই এই জাতীয় এনাম তৈরি করছি question তবে আমার 5-6 টি ক্ষেত্র রয়েছে um

enum Planet{
EARTH(1000000, 312312321,31232131, "some text", "", 12),
....
other planets
....

এই ধরণের ক্ষেত্রে, আপনার যখন এনামগুলিতে একাধিক ক্ষেত্র থাকে, তখন নির্ধারক এবং আই-বলটি দেখতে আপনাকে কোন মানটি কোন ক্ষেত্রের অন্তর্গত তা বোঝা অনেক কঠিন।

static finalধ্রুবক সহ ক্লাস এবং এ Builderজাতীয় অবজেক্ট তৈরি করতে প্যাটার্ন ব্যবহার করে এটি আরও পাঠযোগ্য। তবে, এনাম ব্যবহারের অন্য সমস্ত সুযোগগুলি আপনি হারাবেন। এই শ্রেণীর একটি অসুবিধা হ'ল, আপনাকে Planetস্বয়ংক্রিয়ভাবে বস্তুগুলিকে যুক্ত করতে হবেlist/set এরPlanets.

আমি এখনও, এই ধরনের ক্লাস শেষ enum পছন্দ করা যেমন values()উপকারে আসে এবং আপনি তাদের ব্যবহার করার জন্য প্রয়োজন হলে তুমি কখনো জানবে না switchবা EnumSetবা EnumMapভবিষ্যতে :)


0

প্রধান কারণ: এনামগুলি আপনাকে সু-কাঠামোগত কোড লিখতে সহায়তা করে যেখানে সংকলনের সময় প্যারামিটারের অর্থগত অর্থ স্পষ্ট এবং দৃ .়ভাবে টাইপ করা হয় - সমস্ত কারণগুলির জন্য অন্যান্য উত্তর দিয়েছে for

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

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