package java.lang;

import java.io.Serializable;

import ej.annotation.Nullable;

/**
 * This is the common base class of all Java language enumeration types.
 *
 * More information about enums, including descriptions of the implicitly declared methods
 * synthesized by the compiler, can be found in section 8.9 of <cite>The Java&trade; Language
 * Specification</cite>.
 *
 * @param <E>
 *        The enum type subclass
 */
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {

	/**
	 * Sole constructor. Programmers cannot invoke this constructor. It is for use by code emitted by
	 * the compiler in response to enum type declarations.
	 *
	 * @param name
	 *        - The name of this enum constant, which is the identifier used to declare it.
	 * @param ordinal
	 *        - The ordinal of this enumeration constant (its position in the enum declaration, where
	 *        the initial constant is assigned an ordinal of zero).
	 */
	protected Enum(String name, int ordinal) {
		throw new RuntimeException();
	}

	/**
	 * This method is available for compilation purpose.
	 * @param enumType the Class object of the enum type from which to return a constant
	 * @param name the name of the constant to return
	 * @return the enum constant of the specified enum type with the specified name
	 *
	 * @throws NoSuchMethodError
	 *         always
	 * @param <T> the enum type whose constant is to be returned        
	 */
	public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) {
		throw new RuntimeException();
	}

	/**
	 * Compares this enum with the specified object for order. Returns a negative integer, zero, or a
	 * positive integer as this object is less than, equal to, or greater than the specified object.
	 *
	 * Enum constants are only comparable to other enum constants of the same enum type. The natural
	 * order implemented by this method is the order in which the constants are declared.
	 */
	@Override
	public final int compareTo(E o) {
		throw new RuntimeException();
	}

	/**
	 * Returns true if the specified object is equal to this enum constant.
	 *
	 * @param other
	 *        the object to be compared for equality with this object.
	 * @return true if the specified object is equal to this enum constant.
	 */
	@Override
	public final boolean equals(@Nullable Object other) {
		throw new RuntimeException();
	}

	/**
	 * Returns a hash code for this enum constant.
	 *
	 * @return a hash code for this enum constant.
	 */
	@Override
	public final int hashCode() {
		throw new RuntimeException();
	}

	/**
	 * Returns the name of this enum constant, exactly as declared in its enum declaration.
	 *
	 * <b>Most programmers should use the {@link #toString} method in preference to this one, as the
	 * toString method may return a more user-friendly name.</b> This method is designed primarily for
	 * use in specialized situations where correctness depends on getting the exact name, which will not
	 * vary from release to release.
	 *
	 * @return the name of this enum constant
	 */
	public final String name() {
		throw new RuntimeException();
	}

	/**
	 * Returns the ordinal of this enumeration constant (its position in its enum declaration, where the
	 * initial constant is assigned an ordinal of zero).
	 *
	 * @return the ordinal of this enumeration constant
	 */
	public final int ordinal() {
		throw new RuntimeException();
	}

	/**
	 * Returns the name of this enum constant, as contained in the declaration. This method may be
	 * overridden, though it typically isn't necessary or desirable. An enum type should override this
	 * method when a more "programmer-friendly" string form exists.
	 *
	 * @return the name of this enum constant
	 */
	@Override
	public String toString() {
		throw new RuntimeException();
	}

}
