வணக்கம்! இன்று நாம் ஜாவாவின் சிறப்பு தரவு வகைகளில் ஒன்றைப் பற்றி பேசுவோம்:
Enum
("கணக்கெடுப்பு" என்பதன் சுருக்கம்). இதன் சிறப்பு என்ன? ஒரு திட்டத்தில் "மாதங்கள்" என்ன செயல்படுத்த வேண்டும் என்று கற்பனை செய்யலாம். பிரச்சனையாகத் தெரியவில்லை, இல்லையா? எந்த மாதம் எந்தெந்த பண்புகளைக் கொண்டுள்ளது என்பதை நாம் தீர்மானிக்க வேண்டும். ஒருவேளை நமக்கு முதலில் மாதத்தின் பெயர் மற்றும் அதில் உள்ள நாட்களின் எண்ணிக்கை தேவைப்படலாம். தீர்வு மிகவும் எளிமையானதாக தோன்றுகிறது:
public class Month {
private String name;
private int daysCount;
public Month(String name, int daysCount) {
this.name = name;
this.daysCount = daysCount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDaysCount() {
return daysCount;
}
public void setDaysCount(int daysCount) {
this.daysCount = daysCount;
}
@Override
public String toString() {
return "Month{" +
"name='" + name + '\'' +
", daysCount=" + daysCount +
'}';
}
}
முழு ஷபாங்! எங்களிடம் ஒரு Month
வகுப்பு, தேவையான புலங்கள், பெறுபவர்/செட்டர்கள் மற்றும் toString()
. நிச்சயமாக, நாம் சேர்க்க வேண்டும் equals()
மற்றும்hashCode()
முழுமையான மகிழ்ச்சியை அடைய :) ஆனால் இங்கே நமக்கு ஒரு கருத்தியல் சிக்கல் உள்ளது. நீங்கள் நினைவில் வைத்திருப்பது போல், OOP இன் முக்கிய நன்மைகளில் ஒன்று, இது நிஜ உலகில் இருந்து மாதிரி நிறுவனங்களை எளிதாக்குகிறது. ஒரு நாற்காலி, ஒரு கார், ஒரு கிரகம் - சாதாரண வாழ்க்கையிலிருந்து இந்த கருத்துக்கள் அனைத்தும் சுருக்கத்தின் உதவியுடன் ஒரு திட்டத்தில் எளிதில் குறிப்பிடப்படுகின்றன. சிக்கல் என்னவென்றால், சில நிஜ உலக நிறுவனங்கள் கண்டிப்பாக வரையறுக்கப்பட்ட மதிப்புகளைக் கொண்டுள்ளன. ஒரு வருடத்தில் 4 பருவங்கள் மட்டுமே உள்ளன. ஒரு ஆக்டேவில் வெறும் 8 குறிப்புகள் மட்டுமே உள்ளன. காலெண்டரில் 12 மாதங்கள் மட்டுமே உள்ளன. மேலும் Ocean's 11 இன் Danny Ocean க்கு வெறும் 11 நண்பர்கள் மட்டுமே உள்ளனர் (இது ஒரு பொருட்டல்ல :)) முக்கிய விஷயம் என்னவென்றால், ஒரு சாதாரண ஜாவா வகுப்பினால் இந்த நிறுவனங்களை மாதிரியாகக் கொண்டு அவற்றின் இயல்பான வரம்புகளைச் செயல்படுத்த முடியாது. நமதுMonth
வகுப்பில் தேவையான அனைத்து புலங்களும் உள்ளன. ஆனால் மற்றொரு புரோகிராமர் அதைப் பயன்படுத்தினால், முற்றிலும் பைத்தியக்காரத்தனமான பொருட்களை உருவாக்குவதை யாராலும் தடுக்க முடியாது:
public class Main {
Month month1 = new Month("lolkek", 322);
Month month2 = new Month("yahoooooooooooo", 12345);
}
இது எங்கள் குறியீட்டில் தோன்றினால், குற்றவாளியைக் கண்டுபிடிப்பது எளிதாக இருக்காது! ஒருபுறம், பொருள்களை உருவாக்கும் புரோகிராமர் Month
வர்க்கம் என்பது "ஒரு வருடத்தில் ஒரு மாதம்" என்பதை உணர்ந்து, அத்தகைய முட்டாள்தனத்தை எழுதக்கூடாது. மறுபுறம், புரோகிராமர் வகுப்பு வடிவமைப்பாளர் வழங்கிய திறன்களை மட்டுமே பயன்படுத்திக் கொள்கிறார். தன்னிச்சையான பெயர்கள் மற்றும் நாட்களின் எண்ணிக்கையை ஒதுக்க முடியுமா? அதுதான் நமக்குக் கிடைத்தது. இந்த நிலையில் நாம் என்ன செய்ய வேண்டும்? நேர்மையாக, ஜாவா 1.5 வெளியிடப்படுவதற்கு முன்பு, புரோகிராமர்கள் படைப்பாற்றல் பெற வேண்டும் :) அந்த நாட்களில், அவர்கள் இது போன்ற கட்டமைப்புகளை உருவாக்கினர்:
public class Month {
private String name;
private int daysCount;
private Month(String name, int daysCount) {
this.name = name;
this.daysCount = daysCount;
}
public static Month JANUARY = new Month("January", 31);
public static Month FEBRUARY = new Month("February", 28);
public static Month MARCH = new Month("March", 31);
@Override
public String toString() {
return "Month{" +
"name='" + name + '\'' +
", daysCount=" + daysCount +
'}';
}
}
எடுத்துக்காட்டைக் குறைக்க, இங்கே மாதங்களின் எண்ணிக்கையை பன்னிரண்டிலிருந்து மூன்றாகக் குறைத்துள்ளோம். இத்தகைய வடிவமைப்புகள் சிக்கலைத் தீர்ப்பதை சாத்தியமாக்கியது. பொருள்களை உருவாக்கும் திறன் ஒரு தனியார் கட்டமைப்பாளருக்கு மட்டுப்படுத்தப்பட்டது:
private Month(String name, int daysCount) {
this.name = name;
this.daysCount = daysCount;
}
வகுப்பைப் பயன்படுத்தும் புரோகிராமர்கள் வெறுமனே பொருட்களை உருவாக்க முடியாது Month
. வகுப்பு டெவலப்பர் வழங்கிய இறுதி நிலையான பொருட்களை அவர்கள் பயன்படுத்த வேண்டியிருந்தது. உதாரணமாக, இது போன்றது:
public class Main {
public static void main(String[] args) {
Month january = Month.JANUARY;
System.out.println(january);
}
}
ஆனால், ஜாவா டெவலப்பர்கள் தற்போதுள்ள சிக்கலில் கவனத்தை ஈர்த்தனர். நிச்சயமாக, புரோகிராமர்கள் மொழியில் கிடைக்கும் கருவிகளைப் பயன்படுத்தி ஒரு தீர்வைக் கொண்டு வர முடிந்தது, ஆனால் அது மிகவும் எளிதானது அல்ல! புதியவர்களுக்கு கூட ஒரு தெளிவான தீர்வு தேவைப்பட்டது. அதனால் Enum
ஜாவாவில் தோன்றியது. அடிப்படையில், Enum
வரையறுக்கப்பட்ட பொருள் மதிப்புகளை வழங்கும் ஜாவா வகுப்பு. இது எப்படி இருக்கிறது என்பது இங்கே:
public enum Month {
JANUARY,
FEBRUARY,
MARCH
}
வரையறையில், அது Enum
ஒரு ஜாவா வகுப்பு என்பதை நாங்கள் சுட்டிக்காட்டினோம், ஆனால் அது உண்மையில் உண்மையா? ஆம், நாங்கள் அதை சரிபார்க்கவும் முடியும். எடுத்துக்காட்டாக, எங்கள் Month
enum வேறு சில வகுப்பைப் பெற முயற்சிக்கவும்:
public abstract class AbstractMonth {
}
// Error! The extends clause cannot be used with an enum
public enum Month extends AbstractMonth {
JANUARY,
FEBRUARY,
MARCH
}
அது ஏன் நடக்கிறது? நாம் எழுதும் போது:
public enum Month
கம்பைலர் இந்த அறிக்கையை பின்வரும் குறியீடாக மாற்றுகிறது:
public Class Month extends Enum
உங்களுக்கு ஏற்கனவே தெரியும், ஜாவா பல மரபுகளை ஆதரிக்காது. எனவே, நாம் மரபுரிமை பெற முடியாது AbstractMonth
. இந்த புதிய கட்டுமானத்தை எவ்வாறு Enum
பயன்படுத்தலாம்? வயல்களைக் கொண்ட பழைய கட்டமைப்பிலிருந்து இது எவ்வாறு வேறுபடுகிறது static final
? சரி, உதாரணமாக, பழைய கட்டமைப்பானது அறிக்கைகளில் நமது சொந்த மதிப்புகளைப் பயன்படுத்த அனுமதிக்கவில்லை switch
. ஒவ்வொரு மாதமும் கொண்டாடப்படும் விடுமுறை நாட்களை நினைவூட்டும் ஒரு திட்டத்தை உருவாக்க விரும்புகிறோம் என்று கற்பனை செய்து பாருங்கள்:
public class HolidayReminder {
public void printHolidays(Month month) {
switch (month) {
// Error!
case JANUARY:
}
}
}
நீங்கள் பார்க்க முடியும் என, கம்பைலர் இங்கே ஒரு பிழையை வீசுகிறது. ஆனால் enum
ஜாவா 1.5 இல் தோன்றியவுடன், எல்லாம் மிகவும் எளிமையானது:
public enum Month {
JANUARY,
FEBRUARY,
MARCH
}
public class HolidayReminder {
public void printHolidays(Month month) {
switch (month) {
case JANUARY:
System.out.println("New Year's Day is January 1st!");
break;
case FEBRUARY:
System.out.println("Valentine's Day is February 14th!");
break;
case MARCH:
System.out.println("Saint Patrick's Day is March 17th!");
break;
}
}
}
public class Main {
public static void main(String[] args) {
HolidayReminder reminder = new HolidayReminder();
reminder.printHolidays(Month.JANUARY);
}
}
கன்சோல் வெளியீடு:
New Year's Day is January 1st!
Enum
ஜாவா 1.5 க்கு முன்பு இருந்ததைப் போலவே, பொருள்களுக்கான அணுகல் நிலையானதாக இருந்தது என்பதை நினைவில் கொள்க . Month
மாதங்களை அணுகுவதற்கு நாம் ஒரு பொருளை உருவாக்க வேண்டியதில்லை . Enum
enums உடன் பணிபுரியும் போது, ஒரு முழு அளவிலான வகுப்பு என்பதை மறந்துவிடக் கூடாது . இதன் பொருள், தேவைப்பட்டால், நீங்கள் அதில் உள்ள கட்டமைப்பாளர்கள் மற்றும் முறைகளை வரையறுக்கலாம். எடுத்துக்காட்டாக, முந்தைய குறியீட்டு துண்டில், மதிப்புகளைக் குறிப்பிட்டோம்: ஜனவரி, பிப்ரவரி, மார்ச். Month
இருப்பினும், எங்கள் குழுவை இப்படி விரிவுபடுத்தலாம் :
public enum Month {
JANUARY("January", 31),
FEBRUARY("February", 28),
MARCH("March", 31),
APRIL("April", 30),
MAY("May", 31),
JUNE("June", 30),
JULY("July", 31),
AUGUST("August", 31),
SEPTEMBER("September", 30),
OCTOBER("October", 31),
NOVEMBER("November", 30),
DECEMBER("December", 31);
private String name;
private int daysCount;
Month(String name, int daysCount) {
this.name = name;
this.daysCount = daysCount;
}
public static Month[] getWinterMonths() {
return new Month[]{DECEMBER, JANUARY, FEBRUARY};
}
public static Month[] getSummerMonths() {
return new Month[]{JUNE, JULY, AUGUST};
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDaysCount() {
return daysCount;
}
public void setDaysCount(int daysCount) {
this.daysCount = daysCount;
}
@Override
public String toString() {
return "Month{" +
"name='" + name + '\'' +
", daysCount=" + daysCount +
'}';
}
}
enum
இங்கே எங்கள் 2 புலங்கள் (மாதத்தின் பெயர் மற்றும் நாட்களின் எண்ணிக்கை), இந்த புலங்களைப் பயன்படுத்தும் ஒரு கட்டமைப்பாளர், பெறுபவர்/செட்டர்கள், முறை toString()
மற்றும் 2 நிலையான முறைகள் ஆகியவற்றைக் கொடுத்துள்ளோம் . நீங்கள் பார்க்க முடியும் என, இதில் எந்த பிரச்சனையும் இல்லை. மீண்டும், Enum
உண்மையில் ஒரு முழு அளவிலான வகுப்பு:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
System.out.println(Arrays.toString(Month.getSummerMonths()));
}
}
கன்சோல் வெளியீடு:
[Month{name='June', daysCount=30}, Month{name='July', daysCount=31}, Month{name='August', daysCount=31}]
இறுதியாக, நான் மிகவும் பயனுள்ள ஜாவா புத்தகத்தை பரிந்துரைக்க விரும்புகிறேன், அதாவது ஜோசுவா ப்ளாச்சின் "எஃபெக்டிவ் ஜாவா" . ஆசிரியர் ஜாவாவின் படைப்பாளர்களில் ஒருவர், எனவே மொழியின் கருவிகளை எவ்வாறு சரியாகவும் திறமையாகவும் பயன்படுத்துவது என்பது குறித்த அவரது ஆலோசனையை நீங்கள் நிச்சயமாக நம்பலாம் :) எங்கள் பாடத்தைப் பொறுத்தவரை, புத்தகத்தின் அத்தியாயத்தில் சிறப்பு கவனம் செலுத்துமாறு பரிந்துரைக்கிறேன் Enum
. மகிழ்ச்சியான வாசிப்பு! :)
GO TO FULL VERSION