شمارش (Enumeration)

شمارش، راهی برای تعریف داده‌هایی است که، می‌توانند مقادیر محدودی که شما از قبل تعریف کرده‌اید را، بپذیرند. به عنوان مثال، شما می‌خواهید یک متغیر تعریف کنید که، فقط مقادیر جهت (جغرافیایی) مانند east ،west ،north و south را در خود ذخیره کند. ابتدا یک enumeration تعریف می‌کنید و برای آن یک اسم انتخاب کرده و بعد از آن تمام مقادیر ممکن که می‌توانند در داخل بدنه آن قرار بگیرند تعریف می‌کنید. به نحوه تعریف یک enumeration توجه کنید:

enum enumName
{
   value1,
   value2,
   value3,
   .
   .
   .
   valueN
}

ابتدا کلمه کلیدی enum و سپس نام آن را به کار می‌بریم. در جاوا برای نامگذاری enumeration از روش پاسکال استفاده کنید. در بدنه enum مقادیری وجود دارند که برای هر کدام یک نام در نظر گرفته شده است و به وسیله کاما از هم جدا شده‌اند. به یک مثال توجه کنید :

enum Direction
{
   North,
   East,
   South,
   West
}

به نحوه استفاده از enumeration در یک برنامه جاوا توجه کنید.

   1: package myfirstprogram;
   2: 
   3: import java.text.MessageFormat;
   4: 
   5: enum Direction
   6: {
   7:     North,
   8:     East,
   9:     South,
  10:     West
  11: }
  12: 
  13: public class MyFirstProgram 
  14: {
  15:     public static void main(String[] args) 
  16:     {                
  17:         Direction myDirection;
  18: 
  19:         myDirection = Direction.North;
  20: 
  21:         System.out.println(MessageFormat.format("Direction: {0}", myDirection));
  22:     }   
  23: }
Direction: North

ابتدا enumeration را در خطوط 11-5 تعریف می‌کنیم. توجه کنید که enumeration را خارج از کلاس قرار داده‌ایم. این کار باعث می‌شود که enumeration در سراسر برنامه در دسترس باشد. می‌توان enumeration را در داخل کلاس هم تعریف کرد ولی در این صورت فقط در داخل کلاس قابل دسترس است.

public class MyFirstProgram
{
    enum Direction
    {
          //Code omitted
    }

    public static void main(String[] args)
    {
          //Code omitted  
    }
}

برنامه را ادامه می‌دهیم. در داخل بدنه enumeration نام چهار جهت جغرافیایی وجود دارد (خطوط 10-7). در خط 17 یک متغیر تعریف شده است که مقدار یک جهت را در خود ذخیره می‌کند. نحوه تعریف آن به صورت زیر است :

enumType variableName;

در اینجا enumType نوع داده شمارشی (مثلاً Direction یا مسیر) می‌باشد و variableName نیز نامی است که برای آن انتخاب کرده‌ایم که در مثال قبل myDirection است. سپس یک مقدار به متغیر myDirection اختصاص می‌دهیم (خط 19). برای اختصاص یک مقدار به صورت زیر عمل می‌کنیم :

variable = enumType.value;

ابتدا نوع Enumeration سپس علامت نقطه و بعد مقدار آن (مثلاً North) را می‌نویسیم. می‌توان یک متغیر را فوراً، به روش زیر مقدار دهی کرد :

Direction myDirection = Direction.North;

حال در خط 21 با استفاده از ()println مقدار myDirection را چاپ می‌کنیم. enum ها مانند کلاس‌ها و اینترفیس ها از انواع ارجاعی به حساب می‌آیند و بنابر این می‌توانند دارای سازنده و فیلد و متد باشند. به هر عضو از یک enum می‌توان یک عدد اختصاص داد. به مثال زیر توجه کنید :

                   
   1: package myfirstprogram;
   2: 
   3: enum Direction
   4: {
   5:    North(3),
   6:    East(5),
   7:    South(7),
   8:    West(4);
   9:    
  10:    private final int directionindex;
  11:    
  12:    Direction(int index) 
  13:    {
  14:         this.directionindex = index;
  15:    }
  16:    
  17:    public int GetDirectionIndex() 
  18:    {
  19:         return this.directionindex;
  20:    }
  21: }
  22: 
  23: public class MyFirstProgram 
  24: {
  25:     public static void main(String[] args) 
  26:     {                
  27:         Direction myDirection = Direction.East;
  28:         System.out.println(myDirection.GetDirectionIndex());
  29:     }   
  30: }
5

همانطور که در کد بالا مشاهده می‌کنید یک نوع شمارشی با نام Direction در خطوط 21-3 تعریف کرده‌ایم. به مقادیر این نوع شمارشی در خطوط 8-5 مقادیری را اختصاص داده‌ایم. در خط 10 یک فیلد با نام directionindex تعریف کرده‌ایم تا مقدار هر یک از عناصر شمارشی را که می‌خواهیم به وسیله سازنده‌ای که در خطوط 15-12 تعریف شده است در آن قرار دهیم. برای به دست آوردن این مقادیر هم از متد ()GetDirectionIndex (خطوط 20-17) استفاده می‌کنیم. حال فرض کنید می‌خواهیم مقدار عددی که به East اختصاص داده شده است را به دست آوریم. برای این کار همانطور که در خط 27 مشاهده می‌کنید ابتدا یک نمونه از Direction ایجاد کرده و Direction.East را به آن اختصاص می‌دهیم، سپس در خط 28 با فراخوانی متد ()GetDirectionIndex مقدار عددی East را به دست می‌آوریم. آر همین عدد 5 به دست آمده در مثال بالا می‌توان در ساختارهایی مانند if و switch استفاده کرد :

Direction myDirection = Direction.East;
                        
switch(myDirection.GetDirectionIndex())
{
    case 1 : System.out.println("incorrect!");
        break;
    case 5 : System.out.println("That is Correct.");
        break;
}