एनम टाइप एक खास डेटा टाइप है जो किसी वेरिएबल को पहले से तय कॉन्स्टेंट के समूह में से कोई एक मान लेने देता है।
वेरिएबल की वैल्यू उसके लिए पहले से तय वैल्यू में से किसी एक के बराबर होनी चाहिए।
आम उदाहरणों में दिशाएँ (जैसे 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 (trace)DBG (debug)INF (info)WRN (warning)ERR (error)FTL (fatal)आपको तीन काम करने हैं।
ऊपर दिए गए लॉग लेवल के अनुरूप छह एलिमेंट वाला एक 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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।