معرفی کلیدواژه ی enum در زبان برنامه نویسی جاوا


همان طور که پیش از این توضیح داده شد، متغیری از جنس boolean زمانی مورد استفاده قرار می گیرد که دو حالت بیشتر پیش روی ما وجود نداشته باشد. حال اگر ما در شرایطی قرار بگیریم که بیش از دو حالت پیش روی ما باشد مسلماً از این نوع متغیر نخواهیم توانست استفاده کنیم و از همین رو است که طراحان زبان برنامه نویسی جاوا ساختاری تحت عنوان Enumeration را در این زبان شیء گرا گنجانده اند.

معادل فارسی واژه Enumeration برابر است با "شمارش" و این در حالی است که در زبان برنامه نویسی جاوا این واژه به صورت خلاصه درآمده و به شکل enum نوشته می شود. چنانچه بخواهیم موارد استفاده enum را برشمریم به لیست بلندی از کاربردهای این دستور برخواهیم خورد که در ادامه به برخی از مهم ترین آن ها اشاره ای خواهیم کرد.

یک چراغ راهنما که در چهار راه ها نصب می شود دارای سه حالت سبز، قرمز و زرد است. روزهای هفته شنبه، یکشنبه، دوشنبه، سه شنبه، چهارشنبه، پنج شنبه و جمعه را شامل می شود. یک کشور می تواند توسعه یافته، در حال توسعه و عقب افتاده باشد! اینها مثال هایی هستند که اگر بخواهیم برنامه ای در رابطه با آن ها بنویسیم، ناگزیر می بایست از enum ها استفاده کنیم. در ابتدا طبق روال گذشته یک سناریو تعریف کرده و بر اساس آن برنامه ای می نویسیم.

یک مسابقه فوتبال می تواند سه نتیجه متفاوت داشته باشد: حالت اول این که تیم الف برنده و تیم ب بازنده است، حالت دوم این که تیم ب برنده و تیم الف بازنده است، حالت سوم این که نتیجه مسابقه مساوی می شود (البته در برخی مواقع حالت چهارمی هم وجود دارد به این شکل که بازیکنان بافرهنگ هر دو تیم شروع به زد و خورد کرده و داور مسابقه را لغو می کند!)

برای شروع کار پروژه ای تحت عنوان Enum ایجاد کرده و کلاسی تحت عنوان FootballMatch به معنی "بازی فوتبال" در آن ایجاد می کنیم. در ابتدای کار کد ما می بایست به شکل زیر باشد:

public class FootballMatch {
    public static void main(String[] args) {
    }
}

از آنجا که نیاز داریم تا این امکان را به کاربر بدهیم تا بتواند نتیجه بازی را وارد برنامه کند، به استفاده از کلاس Scanner پرداخته و کد خود را به شکل زیر تکمیل می کنیم:

import java.util.Scanner;
public class FootballMatch {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
    }
}

همان طور که در کد فوق ملاحظه می شود، شیئی تحت عنوان keyboardInput به معنی "ورودی کیبورد" ایجاد کرده ایم که مسئول گرفتن ورودی های کاربر برنامه است. اکنون به صورت زیر اقدام به ساخت enum این برنامه می کنیم:

import java.util.Scanner;
public class FootballMatch {
    enum WhoWins {
        Perspolis, Esteghlal, Equal
    };
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
    }
}

همان طور که در کد فوق مشاهده می شود، پیش از کد مربوط به متد main اقدام به نوشتن کد مربوط به enum می کنیم به این صورت که اول کلید واژه enum را نوشته سپس نامی دلخواه برای آن در نظر می گیریم که در این مثال نام WhoWins به معنی "چه کسی برنده می شود" انتخاب شده است. سپس یک علامت } قرار داده و اقدام به نوشتن حالت های مد نظر خود می کنیم به این صورت که آن ها را با یک علامت کاما از یکدیگر جدا می سازیم و در نهایت یک علامت { قرار داده و پس از آن یک ; قرار می دهیم (لازم به ذکر است که به هر تعداد حالت که بخواهیم می توانیم برای enum خود در نظر بگیریم.)

به طور کلی می توان گفت که enum یک نوع Class است که تغییر شکل داده است(اگر توجه کرده باشیم، خواهیم دید که نحوه نامگذاری آن هم بی شباهت به نامگذاری کلاس ها نیست چرا که با حرف بزرگ آن را نامگذاری کرده ایم.)

در این مثال، سه حالت پرسپولیس، استقلال و برابر را در نظر گرفته ایم. در ادامه نیاز داریم تا از کاربر بخواهیم که نتیجه تیم پرسپولیس را وارد کند. برای این منظور کد فوق را به شکل زیر تکمیل می کنیم:

import java.util.Scanner;
public class FootballMatch {
    enum WhoWins {
        Perspolis, Esteghlal, Equal
    };
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter the score of Perspolis: ");
        int perspolisScore = keyboardInput.nextInt();
    }
}

همان طور که در کد فوق مشاهده می شود، با استفاده از دستور ;()System.out.println جمله ای را به معنی "لطفاً تعداد گل های تیم پرسپولیس را وارد نمایید: " در پنجره ی کنسول نمایش خواهیم داد. سپس متغیری از جنس int تحت عنوان perspolisScore به معنی "امتیاز پرسپولیس" ایجاد کرده و مقدار آن را معادل با شیء ساخته شده از روی کلاس Scanner به علاوه متدی برای گرفتن اعداد صحیح از کیبورد که همان ()nextInt است قرا می دهیم. حال به صورت زیر همین مراحل را برای تیم استقلال تکرار می کنیم:

import java.util.Scanner;
public class FootballMatch {
    enum WhoWins {
        Perspolis, Esteghlal, Equal
    };
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter the score of Perspolis: ");
        int perspolisScore = keyboardInput.nextInt();
        System.out.print("Please enter the score of Estghlal: ");
        int esteghlalScore = keyboardInput.nextInt();
    }
}

به طور خلاصه، مجدد با استفاده از دستور ;()System.out.println عبارتی به معنی "لطفاً تعداد گل های تیم استقلال را وارد نمایید: " را در پنجره ی کنسول به نمایش درآورده سپس متغیری از جنس int تحت عنوان esteghlalScore به معنی "امتیاز استقلال" ایجاد کرده و مقدار آن را معادل با شیء ساخته شده از روی کلاس Scanner به علاوه متدی برای گرفتن اعداد صحیح از کیبورد که همان ()nextInt است قرا می دهیم. اکنون برنامه را اجرا می کنیم:

جمله ی اول به نمایش درآمده که از طریق کیبورد می توانیم عددی برای آن در نظر بگیریم و به محض وارد کردن عدد اول و فشردن دکمه ی اینتر، جمله ی دوم به نمایش درآمده و خواهیم توانست عددی برای آن در نظر بگیریم. حال به منظور مقایسه کردن نتایج هر دو تیم، اقدام به استفاده از دستورات شرطی if می کنیم:

import java.util.Scanner;
public class FootballMatch {
    enum WhoWins {
        Perspolis, Esteghlal, Equal
    };
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter the score of Perspolis: ");
        int perspolisScore = keyboardInput.nextInt();
        System.out.print("Please enter the score of Estghlal: ");
        int esteghlalScore = keyboardInput.nextInt();
        if (perspolisScore > esteghlalScore) {
            System.out.print(WhoWins.Perspolis);
            } else if (esteghlalScore > perspolisScore) {
            System.out.print(WhoWins.Esteghlal);
            } else {
            System.out.print(WhoWins.Equal);
        }
    }
}

به طور کلی به منظور دسترسی به یکی از داده های enum که در این مثال WhoWins نام دارد، اول WhoWins را نوشته و پس از قرار داده یک نقطه نام یکی از داده های داخل enum را می نویسیم. به طور خلاصه به صورت زیر می توان به یکی از داده های enum دست پیدا کرد:

WhoWins.Perspolis;

در اولین عبارت شرطی قید کرده ایم که اگر امتیاز پرسپولیس از استقلال بالاتر بود، دستور ;()System.out.println مقدار WhoWins.Perspolis را نمایش دهد، و اگر امتیاز استقلال از پرسپولیس بالاتر بود دستور ;()System.out.println مقدار WhoWins.Esteghlal را نمایش دهد و در غیر اینصورت دستور ;()System.out.println مقدار WhoWins.Equal را نمایش دهد. اکنون سه بار اقدام به اجرای برنامه می کنیم:

در اجرای اول، امتیاز پرسپولیس را 4 در نظر گرفته و امتیاز استقلال را 2 که پس از فشردن دکمه ی اینتر خواهیم دید که عبارات شرطی اقدام به نمایش گزینه ای از مقادیر enum می کنند که مرتبط با پرسپولیس است.

در اجرای دوم، امتیاز پرسپولیس را 2 در نظر گرفته و امتیاز استقلال را 4 که پس از فشردن دکمه ی اینتر خواهیم دید که عبارات شرطی اقدام به نمایش گزینه ای از مقادیر enum می کنند که مرتبط با استقلال است.

در اجرای سوم، امتیاز پرسپولیس را 0 در نظر گرفته و امتیاز استقلال را 0 که پس از فشردن دکمه ی اینتر خواهیم دید که عبارات شرطی اقدام به نمایش گزینه ای از مقادیر enum می کنند که مرتبط با برابری هر دو تیم است.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
yazdang33
yazdang33
سلام. دوستان یک نکته در مورد Enum ها که در این آموزش گفته نشده به این صورت هست که: Enum ها را بیرون از کلاس نیز میشود تعریف کرد.
کاربر میهمان
کاربر میهمان
سلاممم . خیلی ساده مفهومه Enum رو گفتید من کلی گشتم ولی زیاد نمیفهمیدم به چه دردی میخوری الان تقریبا متوجه شدم. خیلی ممنوننن
کاربر میهمان
کاربر میهمان
خب اصلا چه کاریه که اومدیم از کلاس enum استفاده کردیم اگه قراره از if استفاده کنیم و بعدش بگیم کدوم گزینه رو پرینت کن!! میشد از این کلاس استفاده نکرد و در دستورif همون شرط ها رو برقرار کنیم و بجای استفاده از متد این کلاس داخل دستور System.out.prin مستقیما نوشت استقلال،پرسپلیس و یا مساوری!!
کاربر میهمان
کاربر میهمان
همه اموزش هاتون که فقط مقدماتی هستش خب شروع کنین به سطح متوسط و پیشرفته رو هم شروع کنید دیگه توی اینترنت تا دلتون بخواد آموزش مقدماتی هستش اموزش های پیشرفته و پروژه محور کم پیدا میشه ولی بازم ممنون
aliireza
aliireza
لطفا جواب بدین خیلی برام مهمه ممنون
aliireza
aliireza
سلام از این فایل تمرین که میزارین چجوری باید استفاده کنم
Hooman
Hooman
اصلا مثال جالبی نبود واسه ی کاربرد enum
nikan نیکان زمانی
nikan نیکان زمانی
با شما موافقم ، نه تنها مثال خوبی نبود بلکه کاربرد enum رو هم درست بیان نکرده .
enum برای ساختن متغیری با محتوای دلخواه است برای مثال
WhoWins a = WhoWins.perspolis
یا حتی به علامت ; که اسمش سیمیکالن هست در آخر enum نیازی نیست

در پاسخ به

Naeem.j
Naeem.j
با عرض سلام و خسته نباشید
این کار رو که بدون بکار بردن enum هم میشه انجام داد...
:-))
کاربر میهمان
کاربر میهمان
سلام خسته نباشید.
من وقتی enum رو طبق آموزش ها انجام میدم اکلیپس اصلا نمیشناسه و زیر enum خط میکشه.لطفا راهنماییم کنید؟
yazdang33
yazdang33
سلام. Enum باید دورن کلاس یا بیرون از کلاس تعریف بشه و اگر اون رو داخل متد تعریف کنید ارور میگیره و به قول شما زیرش خط میکشه شک ندارم که شما Enum رو درون متد تعریف کردید(حدس میزنم که درون متد main تعریفش کردید) ولی تعریف Enum درون متد اشتباهه. Enum ها نمیتونن محلی یا همون Local باشند(درون متد تعریف شوند).
در Intellij IDEA به متن ارور به این صورته: Enum must not be local

در پاسخ به

کاربر میهمان
کاربر میهمان
احتمالا اقای محمد شما از علامت " " در دستور print استفاده میکنید
کاربر میهمان
کاربر میهمان
باسلام و تشکر از از سایت خوبتون.میخوام بدونم توی enum میشه متد تعریف کرد یا کارهای دیگه انجام داد کلا چه کارهایی داخل enum قابل انجام؟
yazdang33
yazdang33
سلام. enum ها مثل کلاس ها و اینترفیس ها از انواع ارجاعی هستند پس میتونند دارای کانستراکتور، فیلد و متد باشند.
مثال:
}enum MyEnum
;Yazdan, Reza, Ahmad
;private final int myInt
}(MyEnum(int anInt
;this.myInt = anInt
{
}()public int getMyInt
;return this.myInt
{
{

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام دوست عزیز. ممنون بابت توضیحات خوبتون. فقط میخواستم اگه ممکنه یه مثال بهتر از کاربرد enum بزنین، چون تو این مثال بدون استفاده از enum هم مشکلی پیش نمیومد. واسه همین کاربرد این ساختار واسم جا نیوفتاد. در واقع منظورم اینه، توی این مثال اولاً که خیلی راحت توی دستورات شرطی میتونستیم بگیم که "perspoulice" یا "esteghlal" یا "equal" چاپ بشن و نیازی نبود که این رشته ها رو از enum فراخونی کنیم. یا میتونستیم یه متغیر آرایه ای تعریف کنیم و این رشته ها رو توی اون قرار بدیم. میخوام بدونم چه چیزی باعث میشه که enum رو به این کارها ترجیح بدیم؟ ممنون...
نامشخص
نامشخص
سلام. حرف شما کاملاً درسته. در واقع، زمان برنامه نویسی، n تا راه حل دارین که گاهی اوقات از نظر بهینه بودن زیاد با هم فرقی ندارن. enum هم یکی از راه حل هاییه که به وقتش به درد می خوره. در حال حاضر مثال خوبی در ذهن ندارم. ولی زمانی که مقدار یک متغیر، برابر با مجموعه ای هست از enum میشه استفاده کرد. همون طور که استاد مرادی در بالا نوشتند: مثل روزهای هفته یا ماه و ...

در پاسخ به

کاربر میهمان
کاربر میهمان
من نفهمیدم کاری که "WhoWins.Esteghlal" انجام میده چیه! هر چی بعد از نقطه باشه می نویسه؟
ccc ccc
ccc ccc
مهم نیست. این آموزش صرفا برای نحوه ایجاد enum هست. جنبه کاربردی نداره.

در پاسخ به

www.hamidrezam
www.hamidrezam
سلام خسته نباشین من الان هرکاری میکنم eclips eunm رو نمیشناسه کلن خطا میگیره ازش از همین بالا هم کپی کردم کد رو بتزم ایراد گرفت میشه کمکی کنین

در پاسخ به