Enums

Enumeration is set of predefined values. In Java enumeration is implemented as special class. Variable of enum type can have value only from predefined values.

The enum keyword is used to declare an enum.

Predefined values behave as public static final fields of class. By convention, the names of an enum type's fields are in uppercase letters. In the switch block you can use predefined values directly without type name with dot.

public enum MyEnum{
   CONST1, CONST2
}
MyEnum myEnum = MyEnum.CONST2;
switch(myEnum){ case CONST1: //... break; case CONST2: //... break; }
for(MyEnum el: MyEnum. values()){ System.out.println(el); }

methods

method description
static methods
values() Returns array of predefined values (enum constants).
valueOf(name) Returns the enum constant with the specified name, if exists.
instance methods
name() Returns the name of this enum constant, exactly as declared in its enum declaration.
ordinal() Returns the position in its enum declaration.

enum vs class

Like a regular class, enum can be nested, it can have constructors, fields, and methods and it can implement interfaces.

Unlike a regular class, you cannot create instances of enum type. All enums implicitly extend java.lang.Enum class, so you cannot extend it from other class.

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters
     
    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;
    
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    
    private double mass() { return mass; }
    private double radius() { return radius; }

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    
    double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}