public class EnumTest1 {
	public static void main(String[] args) {
		System.out.println("Enum1 isEnum => " + MyEnum1.A.getClass().isEnum());
		System.out.println("Enum1 parent isEnum => " + MyEnum1.A.getClass().getSuperclass().isEnum());
		
		System.out.println("Enum2 isEnum => " + MyEnum2.A.getClass().isEnum());
		System.out.println("Enum2 parent isEnum => " + MyEnum2.A.getClass().getSuperclass().isEnum());
		
		System.out.println("Enum3 isEnum => " + MyEnum3.A.getClass().isEnum());
		System.out.println("Enum4 isEnum => " + MyEnum4.A.getClass().isEnum());
	}

	// enum with overriden method 
	enum MyEnum1 {
		A {
			@Override
			public int getSomeValue() {
				return 1;
			}
		},
		B {
			@Override
			public int getSomeValue() {
				return 2;
			}
		};

		public abstract int getSomeValue();
	}

	// enum with specific method 
	enum MyEnum2 {
		A{
			public void someMethod1(){}
		}, B{
			public void someMethod2(){}
		};

		public int getSomeValue() {
			return 0;
		}
	}

	// enum without any method 
	enum MyEnum3 {
		A, B;
		public int getSomeValue() {
			return 0;
		}
	}

	// enum with an alternate implementation 
	enum MyEnum4 {
		A, B;
		public int getSomeValue() {
			switch (this) {
			case A:
				return 1;
			case B:
				return 2;
			default:
				throw new RuntimeException("This is not expected");	
			}
		}
	}
}
