Tuesday, 25 December 2012

Enum - in Java





Enumeration


Wikipedia says "An enumeration of a collection of items is a complete, ordered listing of all of the items in that collection"


What is an Enumerated Type?


Enumerated Type is predefined set of constant values that form a group

This is available since JDK 1.5

Before the Enum was introduced, we can achieve similar thing by having a class with private constructor and public constant Object. Example shown below:

public  class State
{
    private State();
    public static final State START = new State();
    public static final State STOP= new State();
    public static final State  RUN= new State();
}
 

Enums in java 1.5


  • All enums extends from java.lang.Enum
  • Enum constants are by default public static

Example of Enum in JDK 1.5 and above: 


enum State
{
     START (1),
     STOP (2),
     RUN (3);

     private int level;

     private State(int level)
     {
         this.level = level;
     }
}

1. use it in switch statements


switch(State)
{
 case START:
          ………….
 case STOP:
          ……….
 case RUN:
         ………..  
} 

2. the enums are constants final. 

  •  It can be compared with ==
  • State threadState = State.RUN; threadState== State.RUN is always true 

3. Enum can over ride methods

enum State
    {
        START (1)
        {
            @Override
            public void log()
            {
                System.out.println("--STARTING--");
            }
        },
        STOP (2)
        {
            @Override
            public void log()
            {
                System.out.println("--STOPPING--");
            }
        },
        RUN (3)
        {
            @Override
            public void log()
            {
                System.out.println("--RUNNING--");
            }
        };

        private int level;

        private State(int level)
        {
            this.level = level;
        }

        public abstract void log();

    }

Importants methods of java.lang.enum


 String name()
Returns the name of this enum constant, exactly as declared in its enum declaration.
State.START.name()  
returns "START"
Int ordinal()
Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero).
State.START.ordinal() returns 1
static  <T extends Enum<T>>  T
valueOf(Class<T> enumType, String name)
Returns the enum constant of the specified enum type with the specified name.
State.valueof(State, "START") returns State.START Object
T[] Values()
Fetch the list of enum  constants declared
State.values(); returns State[]

 

 What is EnumSet?

This is a set implementation to be used in the enum types. All of the elements in an enum set must come from a single enum type that is specified,
static EnumSet<state> set = EnumSet.range(STOP, RUN);

What is EnumMap?

This implements the Map Interface. It takes Enum as the key

 Complete Example - 

Download StateTester.java

package test;

import java.util.EnumMap;
import java.util.EnumSet;

public class StateTester
{

    enum State
    {
        START (1)
        {
            @Override
            public void log()
            {
                System.out.println("--STARTING--");
            }
        },
        STOP (2)
        {
            @Override
            public void log()
            {
                System.out.println("--STOPPING--");
            }
        },
        RUN (3)
        {
            @Override
            public void log()
            {
                System.out.println("--RUNNING--");
            }
        };

        private int level;

        static EnumSet<State> set = EnumSet.range(STOP, RUN);

        private State(int level)
        {
            this.level = level;
        }

        public abstract void log();

    }

    public static void main(String args[])
    {
        System.out.println("Name : "+State.START.name()); // OUTPUT : START
        System.out.println("Ordinal : "+State.RUN.ordinal()); // OUTPUT : 2
        System.out.println("valueOf: "+ State.valueOf("STOP")); // OUTPUT : STOP
        System.out.println("Enum.valueOf : "+ Enum.valueOf(State.class, "START")); // OUTPUT : START
        
        System.out.println("Enumset.contains :"+ State.set.contains(State.START)); //false
        System.out.println("Enumset.contains :"+ State.set.contains(State.STOP)); //true
        System.out.println("values : "+ State.values());   // array [Ltest.StateTester$State;@152b6651

        EnumMap<State, String> stateEnum = new EnumMap<State,String>(State.class);
        stateEnum.put(State.RUN, "run");
        System.out.println("ENUM MAP: "+stateEnum.get(State.RUN));
        System.out.println("ENUM MAP null: "+stateEnum.get(State.START));
        
        System.out.println("wrong valueOf :  "+ State.valueOf("run")); // Exception in thread "main" java.lang.IllegalArgumentException: No enum const class test.StateTester$State.run
    }
}

Output from the above java file:


Name : START
Ordinal : 2
valueOf: STOP
Enum.valueOf : START
Enumset.contains :false
Enumset.contains :true
values : [Ltest.StateTester$State;@6bbc4459
ENUM MAP: run
ENUM MAP null: null

Exception in thread "main" java.lang.IllegalArgumentException: No enum const class test.StateTester$State.run
 at java.lang.Enum.valueOf(Enum.java:196)
 at test.StateTester$State.valueOf(StateTester.java:1)
 at test.StateTester.main(StateTester.java:65)

1 comment: