معرفی کلیدواژه ی 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 رو گفتید من کلی گشتم ولی زیاد نمیفهمیدم به چه دردی میخوری الان تقریبا متوجه شدم. خیلی ممنوننن
کاربر میهمان
naderمن یک کاربر مهمان هستم
خب اصلا چه کاریه که اومدیم از کلاس enum استفاده کردیم اگه قراره از if استفاده کنیم و بعدش بگیم کدوم گزینه رو پرینت کن!! میشد از این کلاس استفاده نکرد و در دستورif همون شرط ها رو برقرار کنیم و بجای استفاده از متد این کلاس داخل دستور System.out.prin مستقیما نوشت استقلال،پرسپلیس و یا مساوری!!
کاربر میهمان
ایمانمن یک کاربر مهمان هستم
همه اموزش هاتون که فقط مقدماتی هستش خب شروع کنین به سطح متوسط و پیشرفته رو هم شروع کنید دیگه توی اینترنت تا دلتون بخواد آموزش مقدماتی هستش اموزش های پیشرفته و پروژه محور کم پیدا میشه ولی بازم ممنون
aliireza
aliireza
لطفا جواب بدین خیلی برام مهمه ممنون
aliireza
aliireza
سلام از این فایل تمرین که میزارین چجوری باید استفاده کنم
Hooman
Hooman
اصلا مثال جالبی نبود واسه ی کاربرد enum
Naeem.j
Naeem.j
با عرض سلام و خسته نباشید
این کار رو که بدون بکار بردن enum هم میشه انجام داد...
:-))
کاربر میهمان
Abolfazlمن یک کاربر مهمان هستم
سلام خسته نباشید.
من وقتی enum رو طبق آموزش ها انجام میدم اکلیپس اصلا نمیشناسه و زیر enum خط میکشه.لطفا راهنماییم کنید؟
کاربر میهمان
ali aryaمن یک کاربر مهمان هستم
احتمالا اقای محمد شما از علامت " " در دستور print استفاده میکنید