enum1. কিভাবে হতে এসেছেন পটভূমি

আজ আমরা জাভাতে অন্য ধরনের ডেটা টাইপ অন্বেষণ করব: enum. নামটি গণনাenum শব্দ থেকে এসেছে । এই ডাটা টাইপ কি এবং এটা কিসের জন্য?

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

উদাহরণস্বরূপ, একটি DayOfTheWeekপ্রকার শুধুমাত্র মান নিতে পারে MONDAY, TUESDAY, WEDNESDAY, ... মোট 7 টি মান আছে। অথবা একটি Monthটাইপ শুধুমাত্র মান নিতে পারে JANUARY, FEBRUARY, MARCH, ... মোট 12 টি মান আছে।

অবশ্যই, আপনি পারে সংখ্যা ( intটাইপ) ব্যবহার করেন: 1— সোমবার, 2— মঙ্গলবার, ইত্যাদি। কিন্তু কেউ ভুলবশত ভুল মান যেমন 8বা 0আপনার ভেরিয়েবলকে বরাদ্দ করতে পারে।

আপনার সহজেই এমন পরিস্থিতি হতে পারে যেখানে একজন প্রোগ্রামার মনে করেন সপ্তাহের দিনগুলি (বা বছরের মাসগুলি) শূন্য থেকে শুরু করে সংখ্যা করা হয়, যখন অন্যরা তাদের সংখ্যা এক থেকে শুরু হবে বলে আশা করে।

এই কারণেই জাভা প্রবর্তন করেছে enum, একটি ডেটা টাইপ যা মানগুলির একটি সসীম সেট নিয়ে গঠিত ।


2. একটি প্রকার ঘোষণা করা

একটি নতুন enumডেটা টাইপ ঘোষণা করা এইরকম দেখাচ্ছে:

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

কোথায় TypeNameনতুন ধরনের (শ্রেণী) নাম এবং সম্ভাব্য মানগুলি কমা দ্বারা পৃথক করা হয়েছে এবং কোঁকড়া ধনুর্বন্ধনীতে মোড়ানো হয়েছে: Value1, Value2, Value3.

একটি উদাহরণ হিসাবে, আসুন আমাদের নিজস্ব তৈরি করা যাক DayOfTheWeek enum:

কোড বিঃদ্রঃ
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
নতুন Dayধরনের

সোমবার
মঙ্গলবার
বুধবার বৃহস্পতিবার
শুক্রবার
শুক্রবার
শনিবার
রবিবার

এখানে আপনি কিভাবে আমাদের নতুন ধরনের একটি ভেরিয়েবলের জন্য একটি মান নির্ধারণ করবেন:

Day day = Day.MONDAY;

উদাহরণ:

কোড বিঃদ্রঃ
Day day = Day.FRIDAY;
System.out.println(day);
পর্দার আউটপুট হবে:
FRIDAY


3. একটি পদ্ধতিenum

একটি enumপ্রকারের বেশ কয়েকটি অন্তর্নির্মিত পদ্ধতি রয়েছে, যার মধ্যে দুটি খুব আকর্ষণীয়:

স্ট্যাটিক values()পদ্ধতি টাইপের সমস্ত মানগুলির একটি অ্যারে প্রদান করে enum:

কোড বিঃদ্রঃ
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
ভেরিয়েবল টাইপের daysমান ধারণকারী একটি অ্যারে সঞ্চয় করে Day(7 উপাদান)

স্ক্রিনে অ্যারের বিষয়বস্তু প্রদর্শন করে:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

পদ্ধতিটি ordinal()ধ্রুবকের ক্রমিক সংখ্যা প্রদান করে। আপনি এটিকে enumএকটি শ্রেণির পরিবর্তে একটি মান হিসাবে কল করুন enum:

কোড কনসোল আউটপুট
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


4. একটি ক্লাসে রূপান্তর করা

বাস্তবে, এখানে যাদুকর কিছুই নেই। কম্পাইলার আমাদের কিছু সিনট্যাকটিক চিনি দিয়েছে। কম্পাইলের সময়, Dayenum একটি সাধারণ ক্লাসে রূপান্তরিত হয়:

কোড, সরলীকৃত সংস্করণ বিঃদ্রঃ
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

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

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
Dayক্লাস

স্ট্যাটিক ধ্রুবকের তালিকা enum A ভেরিয়েবলের







সমস্ত মান সহ একটি অ্যারে যা একটি নির্দিষ্ট অবজেক্টের মান সংরক্ষণ করে ক্লাসটি ব্যক্তিগত, যার মানে ক্লাসের অবজেক্টগুলি শুধুমাত্র ক্লাসের ভিতরে তৈরি করা যেতে পারে । পদ্ধতি একটি বস্তুর উপর কল করা আবশ্যক . এটি বস্তুর মান প্রদান করে - ক্ষেত্র। পদ্ধতিটি ক্লাসের সমস্ত মান সহ একটি স্ট্যাটিক অ্যারে প্রদান করেDay


Day

DayconstructorDayDay



ordinalDay

value


Day

যদি আমরা ক্লাস থেকে সমস্ত স্ট্যাটিক পদ্ধতি এবং ভেরিয়েবল মুছে ফেলি Day, আমরা নিম্নলিখিতগুলি পাই:

কোড বিঃদ্রঃ
public class Day
{
  private int value;

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

  public int ordinal()
  {
    return this.value;
  }
}


ভেরিয়েবলটি অবজেক্ট অবজেক্টের valueমান সংরক্ষণ করে শুধুমাত্র ক্লাসের ভিতরে তৈরি করা যেতে পারে , যেহেতু কনস্ট্রাক্টর হয় । পদ্ধতি বস্তুর প্রদান করে । Day

DayDayprivate




ordinal()valueDay

অন্য কথায়, এখানে ভীতিকর কিছুই ঘটছে না। কম্পাইলার Dayক্লাস তৈরি করে, মানগুলিকে প্রতিনিধিত্ব করে এমন ধ্রুবক যোগ করে enum, প্রয়োজনীয় পদ্ধতি যোগ করে এবং ক্লাস কনস্ট্রাক্টর তৈরি করে private। আমরা একটু পরে কনস্ট্রাক্টর কিভাবে কাজ করে তা দেখব।

আশা করি, এটা এখন পরিষ্কার যে কেন আমরা এইভাবে একটি ভেরিয়েবলের মান নির্ধারণ করি:

Day day = Day.MONDAY;

MONDAYক্লাসে শুধুমাত্র একটি স্থির ক্ষেত্র (ধ্রুবক) Day। ক্লাসের বাইরে থেকে স্ট্যাটিক পদ্ধতি এবং ক্ষেত্রগুলি অ্যাক্সেস করার সময়, আপনাকে অবশ্যই ক্ষেত্র বা পদ্ধতির নামের আগে ক্লাসের নাম নির্দেশ করতে হবে।



5. একটি আরো পদ্ধতিenum

প্রতিটি enumক্লাসের বেশ কিছু আকর্ষণীয় বৈশিষ্ট্য রয়েছে।

একটি স্ট্রিং থেকে এবং থেকে রূপান্তর করা হচ্ছে

একটি enum অবজেক্টকে একটি স্ট্রিং এ রূপান্তর করতে, আপনাকে এর toString()পদ্ধতিতে কল করতে হবে।

String str = Day.MONDAY.toString();

অন্য দিকে রূপান্তর করতে (একটি স্ট্রিং থেকে একটি Dayবস্তুতে), আপনি স্ট্যাটিক valueOf()পদ্ধতি ব্যবহার করতে পারেন:

Day day = Day.valueOf("MONDAY");

এটি অত্যন্ত সুবিধাজনক এবং অনেক ক্ষেত্রে সহায়ক হবে।

একটি সংখ্যা রূপান্তর এবং আবার ফিরে

আপনি ইতিমধ্যেই জানেন কিভাবে একটি enumবস্তুকে একটি সংখ্যায় রূপান্তর করতে হয়: ordinal()পদ্ধতিটি কল করুন:

int index = Day.MONDAY.ordinal();

অন্য দিকে রূপান্তর করতে (একটি সংখ্যা থেকে একটি Dayবস্তুতে), আপনার আরও স্বচ্ছ গঠন প্রয়োজন:

Day day = Day.values()[2];

উদাহরণ:

কোড বিঃদ্রঃ
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
সোমবার
সোমবারের সূচক পান: 0
সপ্তাহের দিন সোমবারের 2 দিন পর

গুরুত্বপূর্ণ পয়েন্ট: যেহেতু enumমানগুলি ধ্রুবকের একটি নির্দিষ্ট সেট, সেগুলিকে == ব্যবহার করে তুলনা করা যেতে পারে । অন্য কথায়, আপনার কাছে MONDAYভিন্ন ঠিকানা সহ দুটি অভিন্ন বস্তু থাকতে পারে না। প্রতিটি enum মানের শুধুমাত্র একটি একক উদাহরণ বিদ্যমান। এবং এর মানে হল যে == ব্যবহার করে enum ভেরিয়েবল তুলনা করা সবসময় কাজ করবে।



6. একটি আপনার নিজস্ব পদ্ধতি যোগ করাenum

যেহেতু একটি enumকম্পাইলের সময় একটি সাধারণ ক্লাসে পরিণত হয়, আপনি এটিতে পদ্ধতিগুলি ঘোষণা করতে পারেন। এই পদ্ধতিগুলি কেবলমাত্র কম্পাইলার তৈরি করা ক্লাসে যোগ করা হয়। উদাহরণস্বরূপ, ধরুন আমরা Day enumএকটি অ্যারের পরিবর্তে enum মানগুলির একটি তালিকা ফেরত দিতে চাই।

তারপর আমরা নিম্নলিখিত কোড যোগ করতে পারেন:

কোড বিঃদ্রঃ
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








মানের তালিকার পরে একটি সেমিকোলন প্রয়োজন।



একটি ArrayListবস্তু তৈরি করুন পদ্ধতি

দ্বারা প্রত্যাবর্তিত অ্যারের মান যোগ করুন values()
তালিকা ফেরত দিন।

এখন এই পদ্ধতিটি কোডে বলা যেতে পারে:

কোড বিঃদ্রঃ
List<Day> list = Day.asList();
ভেরিয়েবলটি listএর সমস্ত মানগুলির একটি তালিকা সংরক্ষণ করবে Day enum