An enumeration is its simplest terms is a list of named constants. Enumerations are a class which great expands on their capabilities, they have a number of methods that they can use which will be demostrated below.
| Basic enumeration | enum Apple {
    Jonathan, GoldenDel, RedDel, Winesap, Cortland
}
public class EnumerationTest1 {
    public static void main(String[] args) {
        Apple a = null;
        a = Apple.Jonathan;
        System.out.println(a);
        if(a == Apple.Jonathan) {
            System.out.println("If Statement: It's a " + a);
        }
        switch (a) {
            case Jonathan:
                System.out.println("Case statement: It's a Jonathan");
            default:
                System.out.println("Could not found apple type");
        }
    }
} | 
      
All enumerations contain two predefined methods
| values() and valueOf() examples | enum Apple {
    Jonathan, GoldenDel, RedDel, Winesap, Cortland
}
public class EnumerationTest2 {
    public static void main(String[] args) {
        Apple[] apples = Apple.values();           // returns an array
        for(Apple a : apples){
            System.out.println(a);
        }
        System.out.println("\n" + Apple.valueOf("RedDel"));
    }
} | 
          
As enumerations are classes which means you have additional power, you can give them the follow
below is an example using some of the above
| enumeration complex example | enum Apple {
    Jonathan(10), GoldenDel(9), RedDel(12), Winesap(15), Cortland(8);
    private int price;                                  // price of each apple
    Apple(int p) { price = p; }                         // constructor
    int getPrice() { return price; }                    // getPrice method
}
public class EnumerationTest3 {
    public static void main(String[] args) {
        for(Apple a : Apple.values()) {
            System.out.println(a + " costs " + a.getPrice());
        }
    }
} | 
          
Sometimes you may want to get the ordinal position of a value in a enumeration, you can use the ordinal method
| Obtain enumeration ordinal position | enum Apple4 {
    Jonathan, GoldenDel, RedDel, Winesap, Cortland
}
public class EnumerationTest4 {
    public static void main(String[] args) {
        System.out.println(Apple4.valueOf("RedDel").ordinal());         // They start at zero
    }
} | 
          
You can embed supplemental information into a source file, this information is called an annotation, it does not change the program but provides meta-data to compiler, various IDE's, etc, they are heavy used in Java frameworks like Spring/SpringBoot. The @ symbol is used to tell the compiler that an annotation is being declared. Common annotations are @Interface, @Retention, @Override, @FunctionalInterface, @SuppressWarnings, @SafeVarargs and @Deprecated.
| Annotation example | @Interface
MyAnno {
    String str();
    int val();
} | 
          
You can create you own annotations
| Create your own annotations | import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)                      // field annotation
@interface JsonElement {
    public String key() default "";
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)                     // method annotation
@interface Init {
}
class Person {
    @JsonElement
    private String firstName;                   // default value is ""
    @JsonElement
    private String lastName;                    // default value is ""
    @JsonElement(key = "personAge")             // set age to the key
    private String age;
    private String address;                     // fields don't have to have a annotation
    @Init
    private void initNames() {
        this.firstName = this.firstName.substring(0, 1).toUpperCase() + this.firstName.substring(1);
        this.lastName = this.lastName.substring(0, 1).toUpperCase() + this.lastName.substring(1);
    }
    // Standard getters and setters
}
public class AnnotationTest1 {
    ...
} |