একটি এনাম টাইপ হলো এক ধরনের বিশেষ ডেটা টাইপ, যার সাহায্যে একটি ভ্যারিয়েবল পূর্বনির্ধারিত কনস্ট্যান্টের একটি সেট হতে পারে।
ভ্যারিয়েবলটিকে তার জন্য পূর্বনির্ধারিত মানগুলোর একটির সমান হতে হবে।
কমন উদাহরণের মধ্যে আছে কম্পাসের দিকনির্দেশ (NORTH, SOUTH, EAST এবং WEST মান) আর সপ্তাহের বারগুলো।
যেহেতু এগুলো কনস্ট্যান্ট, তাই একটি এনাম টাইপের ফিল্ডগুলোর নাম বড় হাতের অক্ষরে লেখা হয়।
Java প্রোগ্রামিং ভাষায় একটি এনাম টাইপ ডিফাইন করতে enum কিওয়ার্ডটি ব্যবহার করেন।
উদাহরণস্বরূপ, সপ্তাহের বারের একটি এনাম টাইপ আপনি এভাবে লিখতে পারেন:
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
যখনই নির্দিষ্ট একটি সেটের কনস্ট্যান্ট উপস্থাপন করার দরকার হয়, তখনই এনাম টাইপ ব্যবহার করা উচিত। এর মধ্যে আছে আমাদের সৌরজগতের গ্রহগুলোর মতো স্বাভাবিক এনাম টাইপ, আর এমন ডেটা সেট যেখানে কম্পাইল টাইমেই সম্ভাব্য সব মান জানা থাকে, যেমন মেনুর পছন্দ, কমান্ড লাইন ফ্ল্যাগ ইত্যাদি।
উপরের DayOfWeek এনামটি কীভাবে ব্যবহার করবেন, তা নিচের কোডে দেখানো হয়েছে:
public class Shop {
public String getOpeningHours(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
return "9am - 5pm";
case SATURDAY:
return "10am - 4pm"
case SUNDAY:
return "Closed.";
}
}
}
var shop = new Shop();
shop.getOpeningHours(DayOfWeek.WEDNESDAY);
// => "9am - 5pm"
Java প্রোগ্রামিং ভাষার এনাম টাইপগুলো অন্য ভাষার সমতুল্য জিনিসের চেয়ে অনেক বেশি শক্তিশালী।
enum ডিক্লারেশন একটি ক্লাস ডিফাইন করে (যাকে এনাম টাইপ বলা হয়)।
এনাম ক্লাসের বডিতে মেথড ও অন্যান্য ফিল্ড থাকতে পারে:
public enum Rating {
GREAT(5),
GOOD(4),
OK(3),
BAD(2),
TERRIBLE(1);
private final int numberOfStars;
Rating(int numberOfStars) {
this.numberOfStars = numberOfStars;
}
public int getNumberOfStars() {
return this.numberOfStars;
}
}
Rating এনাম টাইপের একটি সদস্যের উপর getNumberOfStars মেথড কল করা:
Rating.GOOD.getNumberOfStars();
// => 4
এই অনুশীলনীতে আপনি লগ-লাইন প্রসেস করবেন।
প্রতিটি লগ লাইন নিচের ফরম্যাটে লেখা একটি স্ট্রিং: "[<LVL>]: <MESSAGE>"।
লগ লেভেলগুলো হলো:
TRC (ট্রেস)DBG (ডিবাগ)INF (ইনফো)WRN (ওয়ার্নিং)ERR (এরর)FTL (ফেটাল)আপনার সামনে তিনটি কাজ আছে।
উপরের লগ লেভেলগুলোর সাথে মিলে যায় এমন ছয়টি এলিমেন্টযুক্ত একটি LogLevel এনাম ডিফাইন করুন।
TRACEDEBUGINFOWARNINGERRORFATALএরপর LogLine.getLogLevel() মেথড ইমপ্লিমেন্ট করুন, যা একটি লগ লাইনের পার্স করা লগ লেভেল রিটার্ন করে:
var logLine = new LogLine("[INF]: File deleted");
logLine.getLogLevel();
// => LogLevel.INFO
দুর্ভাগ্যবশত, মাঝে মাঝে কিছু লগ লাইনে একটি অজানা লগ লেভেল থাকে।
এই লগ লাইনগুলো সুন্দরভাবে সামলানোর জন্য LogLevel এনামে একটি UNKNOWN এলিমেন্ট যোগ করুন, যা কোনো অজানা লগ লেভেল পার্স করার সময় রিটার্ন করা উচিত:
var logLine = new LogLine("[XYZ]: Overly specific, out of context message");
logLine.getLogLevel();
// => LogLevel.UNKNOWN
একটি লগ লাইনের লগ লেভেল বেশ লম্বা।
লগ লাইন সংরক্ষণে প্রয়োজনীয় ডিস্ক স্পেস কমানোর জন্য একটি শর্ট ফরম্যাট তৈরি করা হয়েছে: "[<ENCODED_LEVEL>]:<MESSAGE>"।
এনকোড করা লগ লেভেল হলো একটি লগ লেভেলের সাথে একটি সংখ্যার সরল ম্যাপিং:
UNKNOWN - 0
TRACE - 1
DEBUG - 2
INFO - 4
WARNING - 5
ERROR - 6
FATAL - 42
LogLine.getOutputForShortLog() মেথড ইমপ্লিমেন্ট করুন, যা সংক্ষিপ্ত লগ লাইন ফরম্যাট আউটপুট দিতে পারে:
var logLine = new LogLine("[ERR]: Stack Overflow");
logLine.getOutputForShortLog();
// => "6:Stack Overflow"
Exercism-এ সাইন আপ করুন, Java ট্র্যাকের 26টি কনসেপ্ট158টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।