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


همان‌طور که در آموزش آشنایی با روش‌های نام‌گذاری متغیرها در زبان برنامه‌نویسی جاوا توضیح دادیم، دیتا تایپ boolean به منظور تعریف شرایطی مورد استفاده قرار می‌گیرد که در آن بیش از دو حالت نداشته باشیم و مسلماً اگر در شرایطی قرار بگیریم که بیش از دو حالت پیش روی ما باشد، به طور قطع از این دیتا تایپ نخواهیم توانست استفاده کنیم که طراحان زبان برنامه‌نویسی جاوا برای چنین شرایطی enum را در این زبان شیئ‌گرا گنجانده‌اند.

در واقع، کیورد enum از واژۀ 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 از روی کلاس Scanner ایجاد کرده‌ایم و با استفاده از دستور System.in امکان دسترسی سیستم به ورودی آی‌دی‌ای را فراهم نموده‌ایم سپس به صورت زیر اقدام به تعریف ساختار 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 یا به عبارتی داخل علائم { } حالت‌های مد نظر خود را نوشته و آن‌ها را با علامت , از هم جدا می‌کنیم (توجه داشته باشیم که با مد نظر قرار دادن نیاز مسئله می‌توانیم به تعداد دلخواه حالات مختلف تعریف نماییم.)

در سناریوی مطرح‌شده در این آموزش، سه حالت تیم برندۀ پرسپولیس، تیم برندۀ استقلال و حالت مساوی را در نظر می‌گیریم. در همین راستا، در ادامه نیاز داریم تا از کاربر بخواهیم که امتیاز هر یک از تیم‌ها را وارد برنامه کند تا بتوانیم با مقایسۀ امتیازهای آن‌ها تیم برنده را مشخص نماییم که برای این منظور کد فوق را به شکل زیر تکمیل می‌کنیم:

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();
        keyboardInput.close();
    }
}

در کد فوق، ابتدا استرینگ «:Please enter the score of Perspolis» را در پنجرۀ کنسول نمایش می‌دهیم تا به کاربر اطلاع دهیم که امتیاز تیم پرسپولیس را وارد برنامه کند سپس با استفاده از دیتا تایپ int متغیری تحت عنوان perspolisScore ایجاد کرده و مقدار حاصل از فراخوانی متد ()nextInt روی آبجکت ساخته‌شده از روی کلاس Scanner را بدان منتسب می‌کنیم. بنابراین دیتای مربوط به امتیاز تیم پرسپولیس توسط متد ()nextInt خوانده شده و در متغیر perspolisScore نگهداری می‌شود. حال به صورت زیر همین مراحل را برای دریافت امتیاز تیم استقلال تکرار می‌کنیم:

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();
        keyboardInput.close();
    }
}

در کد فوق، ابتدا استرینگی در کنسول نمایش می‌دهیم تا کاربر امتیاز تیم استقلال را وارد برنامه کند سپس مشابه آنچه که در بالا توضح دادیم، مقدار ورودی را خوانده و آن را به متغیر esteghlalScore منتسب می‌کنیم. اکنون برنامه را اجرا می‌کنیم و در خروجی خواهیم داشت:

Please enter the score of Perspolis: 2
Please enter the score of Estghlal: 2

همان‌طور که ملاحظه می‌کنیم، استرینگ اول چاپ شده و در ادامه از طریق کیبورد می‌توانیم عدد مربوط به امتیاز تیم پرسپولیس را وارد کنیم که به محض وارد کردن عدد اول و فشردن دکمۀ اینتر، استرینگ دوم به نمایش درآمده و می‌توانیم عدد مربوط به امتیاز تیم استقلال را وارد کنیم. حال جهت مقایسۀ نتایج هر دو تیم، اقدام به استفاده از دستوراتی شرطی از جنس if می‌کنیم (جهت کسب اطلاعات بیشتر در این مورد، به آموزش آشنایی با دستور شرطی 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 + " is the Winner.");
            } else if (esteghlalScore > perspolisScore) {
            System.out.print(WhoWins.Esteghlal + " is the Winner.");
            } else {
            System.out.print(WhoWins.Equal);
        }
        keyboardInput.close();
    }
}

در کد فوق، از دستورات شرطی تودرتو استفاده کرده‌ایم بدین صورت که چنانچه مقدار منتسب به متغیر perspolisScore بزرگ‌تر از esteghlalScore باشد، دستور شرطی برقرار بوده و دستورات مرتبط با آن مبنی بر چاپ مقدار Perspolis از ساختار enum تحت عنوان WhoWins به همراه استرینگ «.is the Winner» اجرا می‌شوند و در غیر این صورت مجدداً در دستور else if بررسی می‌کنیم که چنانچه مقدار اختصاص‌یافته به متغیر esteghlalScore  بزرگ‌تر از مقدار متغیر perspolisScore باشد، مقدار Esteghlal به همراه استرینگ مربوطه در کنسول چاپ گردد و در صورت برقرار نبودن هیچ یک از این شروط نیز دستورات مرتبط با else اجرا شده و دیتای Equal در کنسول چاپ می‌شود (توجه داشته باشیم که برای دسترسی به هر یک از مقادیر ساختار enum ابتدا نام آن را نوشته سپس یک علامت . قرار داده و در ادامه نام دیتای مورد نظر جهت دستیابی به آن را درج می‌کنیم.) اکنون برنامه را اجرا کرده به طوری که در خروجی خواهیم داشت:

Please enter the score of Perspolis: 4
Please enter the score of Estghlal: 2
Perspolis is the Winner.

در اجرای اول، امتیاز تیم پرسپولیس را 4 در نظر گرفته و امتیاز استقلال را 2 وارد کرده‌ایم که پس از فشردن دکمۀ اینتر می‌بینیم که شرط اول برقرار بوده و مقدار Perspolis در کنسول چاپ می‌شود. در ادامه مجدداً برنامه را اجرا کرده و این بار امتیاز تیم استقلال را عددی بالاتر وارد می‌کنیم به طوری که داریم:

Please enter the score of Perspolis: 2
Please enter the score of Estghlal: 4
Esteghlal is the Winner.

در اجرای دوم، امتیاز تیم پرسپولیس را 2 در نظر گرفته و امتیاز استقلال را 4 وارد کرده‌ایم که در این صورت دستور else if برقرار بوده و از همین روی مقدار Esteghlal در کنسول چاپ می‌گردد. در این مرحله، برنامه را یک بار دیگر اجرا کرده و امتیازی برابر برای هر دو تیم وارد می‌کنیم به طوری که در خروجی خواهیم داشت:

Please enter the score of Perspolis: 0
Please enter the score of Estghlal: 0
Equal

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

دانلود فایل‌های تمرین


بهزاد مرادی

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
yazdang33
yazdang33
۱۳۹۷/۰۵/۲۱
سلام. دوستان یک نکته در مورد Enum ها که در این آموزش گفته نشده به این صورت هست که: Enum ها را بیرون از کلاس نیز میشود تعریف کرد.
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۶/۱۰/۰۵
سلاممم . خیلی ساده مفهومه Enum رو گفتید من کلی گشتم ولی زیاد نمیفهمیدم به چه دردی میخوری الان تقریبا متوجه شدم. خیلی ممنوننن
کاربر میهمان
ایمانمن یک کاربر مهمان هستم
۱۳۹۵/۰۶/۱۲
همه اموزش هاتون که فقط مقدماتی هستش خب شروع کنین به سطح متوسط و پیشرفته رو هم شروع کنید دیگه توی اینترنت تا دلتون بخواد آموزش مقدماتی هستش اموزش های پیشرفته و پروژه محور کم پیدا میشه ولی بازم ممنون
Hooman
Hooman
۱۳۹۵/۰۴/۲۸
اصلا مثال جالبی نبود واسه ی کاربرد enum
Naeem.j
Naeem.j
۱۳۹۵/۰۴/۰۸
با عرض سلام و خسته نباشید
این کار رو که بدون بکار بردن enum هم میشه انجام داد...
:-))
کاربر میهمان
Abolfazlمن یک کاربر مهمان هستم
۱۳۹۵/۰۲/۲۶
سلام خسته نباشید.
من وقتی enum رو طبق آموزش ها انجام میدم اکلیپس اصلا نمیشناسه و زیر enum خط میکشه.لطفا راهنماییم کنید؟
کاربر میهمان
علیرضامن یک کاربر مهمان هستم
۱۳۹۴/۱۰/۰۶
باسلام و تشکر از از سایت خوبتون.میخوام بدونم توی enum میشه متد تعریف کرد یا کارهای دیگه انجام داد کلا چه کارهایی داخل enum قابل انجام؟
کاربر میهمان
محسنمن یک کاربر مهمان هستم
۱۳۹۴/۰۹/۲۳
سلام دوست عزیز. ممنون بابت توضیحات خوبتون. فقط میخواستم اگه ممکنه یه مثال بهتر از کاربرد enum بزنین، چون تو این مثال بدون استفاده از enum هم مشکلی پیش نمیومد. واسه همین کاربرد این ساختار واسم جا نیوفتاد. در واقع منظورم اینه، توی این مثال اولاً که خیلی راحت توی دستورات شرطی میتونستیم بگیم که "perspoulice" یا "esteghlal" یا "equal" چاپ بشن و نیازی نبود که این رشته ها رو از enum فراخونی کنیم. یا میتونستیم یه متغیر آرایه ای تعریف کنیم و این رشته ها رو توی اون قرار بدیم. میخوام بدونم چه چیزی باعث میشه که enum رو به این کارها ترجیح بدیم؟ ممنون...
کاربر میهمان
محمدمن یک کاربر مهمان هستم
۱۳۹۴/۰۸/۲۰
من نفهمیدم کاری که "WhoWins.Esteghlal" انجام میده چیه! هر چی بعد از نقطه باشه می نویسه؟