blob: a5e43192c66c50c330bb6c0169cbd33ca09b66dc [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2002, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
****************************************************************************/
package org.eclipse.gmf.runtime.common.core.util;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.List;
/**
* An enumeration of constants based on the typesafe enum pattern.
*
* @author khussey
*/
public abstract class EnumeratedType
implements Serializable {
/**
* The name of this enumerated value.
*/
private final transient String name;
/**
* The ordinal for this enumerated value.
*/
private final int ordinal;
/**
* Concrete subclasses should define a private static field to generate
* ordinals and a private constructor as follows:
* <p>
* <code>
* private static int nextOrdinal = 0;
*
* private Subclass(String name) {
* super(name, nextOrdinal++);
* }
* </code>
*
* @param name
* The name of the new enumerated type.
* @param ordinal
* The ordinal for the new enumerated type.
*/
protected EnumeratedType(String name, int ordinal) {
super();
this.name = name;
this.ordinal = ordinal;
}
/**
* Retrieves the value of the <code>name</code> instance variable.
*
* @return The value of the <code>name</code> instance variable.
*/
public String getName() {
return name;
}
/**
* Retrieves the value of the <code>ordinal</code> instance variable.
*
* @return The value of the <code>ordinal</code> instance variable.
*/
public final int getOrdinal() {
return ordinal;
}
/**
* Retrieves the list of constants for this enumerated type.
* <p>
* Concrete subclasses should define a private static array of values and
* a(n) (final) implementation of this method as follows:
* <p>
* <code>
* private static final Subclass[] VALUES = { ... };
*
* protected final List getValues() {
* return Collections.unmodifiableList(Arrays.asList(VALUES));
* }
* </code>
*
* @return The list of constants for this enumerated type.
*/
protected abstract List getValues();
/**
* Indicates whether some other object is "equal to" this enumerated type.
*
* @return <code>true</code> if this enumerated type is the same as the
* object argument; <code>false</code> otherwise.
* @param object
* The reference object with which to compare.
*
* @see java.lang.Object#equals(Object)
*/
public final boolean equals(Object object) {
return super.equals(object);
}
/**
* Retrieves a hash code value for this enumerated type. This method is
* supported for the benefit of hashtables such as those provided by
* <code>java.util.Hashtable</code>.
*
* @return A hash code value for this enumerated type.
*
* @see java.lang.Object#hashCode()
*/
public final int hashCode() {
return super.hashCode();
}
/**
* Retrieves a textual representation of this enumerated type.
*
* @return A textual representation of this enumerated type.
*
* @see java.lang.Object#toString()
*/
public String toString() {
return getName();
}
/**
* Designates an alternative object to be used when reading an enumerated
* type from a stream.
*
* @return The alternative enumerated type object.
* @throws ObjectStreamException
* @see java.io.Serializable
*/
protected final Object readResolve()
throws ObjectStreamException {
return getValues().get(getOrdinal());
}
}