import java.util.Vector;
import java.util.Enumeration;


/**
   TypeSafeEnum base class for building type safe enumeration
   subclasses.
 */
public class TypeSafeEnum
{
    private static class enumInfo
    {
	public int hashCode;
	public int count;
	public Vector values;

	enumInfo( int hash )
	{
	    hashCode = hash;
	    count = 0;
	    values = new Vector();
	}
    } // class enumInfo


    private static Vector infoVec = new Vector();

    private String mName;
    private int mValue;

    public TypeSafeEnum( String name, Class cls )
    {
	mName = name;
	enumInfo elem = findInfo( cls, true );
	mValue = elem.count;
	elem.count++;
	elem.values.add( this );
    } // TypeSafeEnum constructor


    public static Enumeration enumValues( Class cls )
    {
	Enumeration e = null;
	enumInfo elem = findInfo( cls, false );
	if (elem != null) {
	    e = elem.values.elements();
	}
	return e;
    } // enumValues


    public String getName() { return mName; }
    public int getValue() { return mValue; }

    
    /**
       Find the entry for the enumeration, if it exists.  If not,
       add it to the end of the enumInfo.  Note that this
       function has linear time, but the assumption is that there
       will not a large number of enumeration classes.
     */ 
    private static enumInfo findInfo(Class cls, boolean add)
    {
	enumInfo foundElem = null;
	int hashCode = cls.hashCode();
	for (Enumeration e = infoVec.elements(); e.hasMoreElements(); ) {
	    enumInfo elem = (enumInfo)e.nextElement();
	    if (elem.hashCode == hashCode) {
		foundElem = elem;
		break;
	    }
	}
	if (foundElem == null && add) {
	    foundElem = new enumInfo(hashCode);
	    infoVec.add( foundElem  );
	}
	return foundElem;
    }  // findInfo
    
}

back to A Type-safe Enumeration Class in Java (and C++)