enum in java
Enum was introduced in Java 1.5 as a new type whose fields consists of a fixed set of constants. For example, we can create directions as Java Enum with fixed fields as EAST, WEST, NORTH, and SOUTH.
Enum was introduced in Java 1.5 as a new type whose fields consist of a fixed set of constants. For example, we can create routes with Java Enums with fixed fields EAST, WEST, NORTH and SOUTH.
Java Enumeration ( Java Enum )
In this tutorial, we will learn know how to create an Enum. We will also look into the benefits of using enums in java and features of enum types. We will also learn using Java Enum valueOf
, enum values
, EnumSet
and EnumMap
with examples.
In this tutorial, we will learn how to create an enumeration. We will also explore the benefits of using enumerations in Java and the capabilities of enumeration types. We'll also learn to use Java valueOf
Enums, enums values
, EnumSet
and EnumMap
examples with examples.
Java Enum Example _
Java enum keyword is used to create an enum type. Let’s have a look at the java enum example program.
The Java enum keyword is used to create enumeration types. Let's take a look at the Java enumeration example program.
package com.journaldev.enums;
public enum ThreadStates {
START,
RUNNING,
WAITING,
DEAD;
}
In above example, ThreadStates is the enum with fixed constants fields START, RUNNING, WAITING and DEAD.
In the above example, ThreadStates is an enumeration with fixed constant fields START, RUNNING, WAITING and DEAD.
Java Enum vs Constants ( Java Enum vs Constants )
Now let’s see how java enum is better than normal constants fields in Java classes.
Now let's see how Java enums are better than normal constant fields in Java classes.
Let’s create a similar constants class in java.
Let us create a similar constant class in java.
package com.journaldev.enums;
public class ThreadStatesConstant {
public static final int START = 1;
public static final int WAITING = 2;
public static final int RUNNING = 3;
public static final int DEAD = 4;
}
Now let’s see how both enum and constants are used in a java program:
Now, let's see how to use both enums and constants in a Java program:
/**
* This method shows the benefit of using Enum over Constants
*/
private static void benefitsOfEnumOverConstants() {
//Enum values are fixed
simpleEnumExample(ThreadStates.START);
simpleEnumExample(ThreadStates.WAITING);
simpleEnumExample(ThreadStates.RUNNING);
simpleEnumExample(ThreadStates.DEAD);
simpleEnumExample(null);
simpleConstantsExample(1);
simpleConstantsExample(2);
simpleConstantsExample(3);
simpleConstantsExample(4);
//we can pass any int constant
simpleConstantsExample(5);
}
private static void simpleEnumExample(ThreadStates th) {
if(th == ThreadStates.START) System.out.println("Thread started");
else if (th == ThreadStates.WAITING) System.out.println("Thread is waiting");
else if (th == ThreadStates.RUNNING) System.out.println("Thread is running");
else System.out.println("Thread is dead");
}
private static void simpleConstantsExample(int i) {
if(i == ThreadStatesConstant.START) System.out.println("Thread started");
else if (i == ThreadStatesConstant.WAITING) System.out.println("Thread is waiting");
else if (i == ThreadStatesConstant.RUNNING) System.out.println("Thread is running");
else System.out.println("Thread is dead");
}
If we look at the above example, we have two risks with using constants that are solved by the enum.
If we look at the above example, using constants resolved by enums has two risks.
- We can pass any int constant to the
simpleConstantsExample
method but we can pass only fixed values to simpleEnumExample, so it provides type safety.We can pass any int constant to thesimpleConstantsExample
method, but we can only pass fixed values to simpleEnumExample, so it provides type safety. - We can change the int constants value in
ThreadStatesConstant
class but the above program will not throw any exception. Our program might not work as expected but if we change the enum constants, we will get compile time error that removes any possibility of runtime issues.We canThreadStatesConstant
change the int constant value in the class but the above program will not throw any exception. Our program may not work as expected, but if we change the enum constant, we get a compile-time error, eliminating any runtime issues.
Java Enum Methods ( Java Enum Methods )
Now let’s see more features of java enum with an example.
Now, let's look at some more features of an example Java enum.
package com.journaldev.enums;
import java.io.Closeable;
import java.io.IOException;
/**
* This Enum example shows all the things we can do with Enum types
*
*/
public enum ThreadStatesEnum implements Closeable{
START(1){
@Override
public String toString(){
return "START implementation. Priority="+getPriority();
}
@Override
public String getDetail() {
return "START";
}
},
RUNNING(2){
@Override
public String getDetail() {
return "RUNNING";
}
},
WAITING(3){
@Override
public String getDetail() {
return "WAITING";
}
},
DEAD(4){
@Override
public String getDetail() {
return "DEAD";
}
};
private int priority;
public abstract String getDetail();
//Enum constructors should always be private.
private ThreadStatesEnum(int i){
priority = i;
}
//Enum can have methods
public int getPriority(){
return this.priority;
}
public void setPriority(int p){
this.priority = p;
}
//Enum can override functions
@Override
public String toString(){
return "Default ThreadStatesConstructors implementation. Priority="+getPriority();
}
@Override
public void close() throws IOException {
System.out.println("Close of Enum");
}
}
Java Enum Important Points
Below are some of the important points for Enums in Java.
Following are some key points in Java enumeration.
- All java enum implicitly extends
java.lang.Enum
class that extends Object class and implements Serializable and Comparable interfaces. So we can’t extend any class in enum.All java enums implicitly extendjava.lang.Enum
class which extends Object class and implements Serializable and Comparable interfaces. Therefore, we cannot extend any class in the enum. - Since enum is a keyword, we can’t end package name with it, for example
com.journaldev.enum
is not a valid package name.Since enum is a keyword, we can't use it to end a package name likecom.journaldev.enum
not a valid package name. - Enum can implement interfaces. As in above enum example, it’s implementing
Closeable
interface.Enumerations can implement interfaces . As in the example above, it implements theCloseable
interface. - Enum constructors are always private.Enum constructors are always private.
- We can’t create instance of enum using new operator.We cannot create enum instance using new operator.
- We can declare abstract methods in java enum, then all the enum fields must implement the abstract method. In above example
getDetail()
is the abstract method and all the enum fields have implemented it.We can declare abstract methods in Java enums and then all enum fields must implement abstract methods. In the above example, is the abstract method, which is already implemented by all enumeration fields.getDetail()
- We can define a method in enum and enum fields can override them too. For example,
toString()
method is defined in enum and enum field START has overridden it.We can define a method in an enum and enum fields can override them as well. For example, a method is defined in an enumtoString()
, and the enum field START has overridden it. - Java enum fields has namespace, we can use enum field only with class name like
ThreadStates.START
Java enum fields have namespaces, we can only use enum fields with class names likeThreadStates.START
- Enums can be used in switch statement, we will see it in action in the later part of this tutorial.Enums can be used in switch statements, and we'll see it in action later in this tutorial.
- We can extend existing enum without breaking any existing functionality. For example, we can add a new field NEW in ThreadStates enum without impacting any existing functionality.We can extend existing enums without breaking any existing functionality. For example, we can add a new field NEW to the ThreadStates enumeration without affecting any existing functionality.
- Since enum fields are constants, java best practice is to write them in block letters and underscore for spaces. For example EAST, WEST, EAST_DIRECTION etc.Since enum fields are constants, Java best practice is to use capital letters and underscore them for spaces. For example EAST, WEST, EAST_DIRECTION, etc.
- Enum constants are implicitly static and finalenum constants are implicitly static and final
- Enum constants are final but it’s variable can still be changed. For example, we can use
setPriority()
method to change the priority of enum constants. We will see it in usage in below example.An enum constant is final, but its variables can still be changed. For example, we can usesetPriority()
methods to change the priority of enum constants. We will see its usage in the example below. - Since enum constants are final, we can safely compare them using “==” and equals() methods. Both will have the same result.Since enum constants are final constants, we can compare them safely using "==" and equals() methods. Both will have the same result.
Java EnumSet,EnumMap,valueOf() (Java EnumSet, EnumMap, valueOf())
Now we know most of the features of Enum, let’s have a look at Java Enum example program. Then we will learn some more features of an enum.
Now that we know most of the features of Enum, let's take a look at the Java Enum example program. Then, we'll learn more about enumerations.
package com.journaldev.enums;
import java.io.IOException;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Set;
public class JavaEnumExamples {
public static void main(String[] args) throws IOException {
usingEnumMethods();
usingEnumValueOf();
usingEnumValues();
usingEnumInSwitch(ThreadStatesEnum.START);
usingEnumInSwitch(ThreadStatesEnum.DEAD);
usingEnumMap();
usingEnumSet();
}
private static void usingEnumSet() {
EnumSet enumSet = EnumSet.allOf(ThreadStatesEnum.class);
for(ThreadStatesEnum tsenum : enumSet){
System.out.println("Using EnumSet, priority = "+tsenum.getPriority());
}
}
private static void usingEnumMap() {
EnumMap<ThreadStatesEnum, String> enumMap = new EnumMap<ThreadStatesEnum,String>(ThreadStatesEnum.class);
enumMap.put(ThreadStatesEnum.START, "Thread is started");
enumMap.put(ThreadStatesEnum.RUNNING, "Thread is running");
enumMap.put(ThreadStatesEnum.WAITING, "Thread is waiting");
enumMap.put(ThreadStatesEnum.DEAD, "Thread is dead");
Set keySet = enumMap.keySet();
for(ThreadStatesEnum key : keySet){
System.out.println("key="+key.toString()+":: value="+enumMap.get(key));
}
}
private static void usingEnumInSwitch(ThreadStatesEnum th) {
switch (th){
case START:
System.out.println("START thread");
break;
case WAITING:
System.out.println("WAITING thread");
break;
case RUNNING:
System.out.println("RUNNING thread");
break;
case DEAD:
System.out.println("DEAD thread");
}
}
private static void usingEnumValues() {
ThreadStatesEnum[] thArray = ThreadStatesEnum.values();
for(ThreadStatesEnum th : thArray){
System.out.println(th.toString() + "::priority="+th.getPriority());
}
}
private static void usingEnumValueOf() {
ThreadStatesEnum th = Enum.valueOf(ThreadStatesEnum.class, "START");
System.out.println("th priority="+th.getPriority());
}
private static void usingEnumMethods() throws IOException {
ThreadStatesEnum thc = ThreadStatesEnum.DEAD;
System.out.println("priority is:"+thc.getPriority());
thc = ThreadStatesEnum.DEAD;
System.out.println("Using overriden method."+thc.toString());
thc = ThreadStatesEnum.START;
System.out.println("Using overriden method."+thc.toString());
thc.setPriority(10);
System.out.println("Enum Constant variable changed priority value="+thc.getPriority());
thc.close();
}
}
Before explaining other important features of enum, let’s see the output of the above program.
Before explaining other important functions of enumeration, let's look at the output of the above program.
priority is:4
Using overriden method.Default ThreadStatesConstructors implementation. Priority=4
Using overriden method.START implementation. Priority=1
Enum Constant variable changed priority value=10
Close of Enum
th priority=10
START implementation. Priority=10::priority=10
Default ThreadStatesConstructors implementation. Priority=2::priority=2
Default ThreadStatesConstructors implementation. Priority=3::priority=3
Default ThreadStatesConstructors implementation. Priority=4::priority=4
START thread
DEAD thread
key=START:: value=Thread is started
key=RUNNING:: value=Thread is running
key=WAITING:: value=Thread is waiting
key=DEAD:: value=Thread is dead
Using EnumSet, priority = 10
Using EnumSet, priority = 2
Using EnumSet, priority = 3
Using EnumSet, priority = 4
Important Points _ _
- The
usingEnumMethods()
methods shows how to create an enum object and how we can use its methods. It’s also showing use ofsetPriority(int i)
method to change the variable of enum.usingEnumMethods()
Methods shows how to create an enumeration object and how to use its methods. It also shows the use ofsetPriority(int i)
methods to change the variables of the enum. usingEnumValueOf()
shows the usage ofjava.util.Enum
valueOf(enumType, name)
through which we can create an enum object from String. It throwsIllegalArgumentException
if the specified enum type has no constant with the specified name, or the specified class object does not represent an enum type. It also throwsNullPointerException
if any of the arguments are null.usingEnumValueOf()
Shows thejava.util.Enum
valueOf(enumType, name)
usage by which we can create an enum object from String. Thrown if the specified enum type does not have a constant with the specified name, or if the specified class object does not represent an enum typeIllegalArgumentException
. It also raises if any parameter is nullNullPointerException
.usingEnumValues()
method shows the usage of values() method that returns an array containing all of the values of the enum in the order they are declared. Note that this method is automatically generated by java compiler for every enum. You won’t find values() implementation injava.util.Enum
class.usingEnumValues()
The use of method showvalue () method returns an array containing all the values of the enumeration in the order in which they are declared . Note that this method is automatically generated by the java compiler for each enumeration. You won't find values() implementations in classes.java.util.Enum
- The
usingEnumInSwitch()
method shows how to use enum constants in switch case.usingEnumInSwitch()
method demonstrates how to use enum constants when switching. usingEnumMap()
method shows use of java.util.EnumMap, which is introduced in Java 1.5 Collections Framework.EnumMap
is Map implementation for use with enum type keys. All of the keys in an enum map must come from a single enum type that is specified, explicitly or implicitly, when the map is created. We can’t use null as key for EnumMap and EnumMap is not synchronized.usingEnumMap()
方法显示了Java 1.5 Collections Framework中引入的java.util.EnumMap的使用。EnumMap
是与枚举类型键一起使用的Map实现。 枚举映射中的所有键都必须来自创建映射时显式或隐式指定的单个枚举类型。 我们不能将null用作EnumMap的键,并且EnumMap不同步。usingEnumSet()
method shows use of java.util.EnumSet, which is Set implementation for use with enum types. All of the elements in an enum set must come from a single enum type that is specified, explicitly or implicitly, when the set is created. EnumSet is not synchronized and null elements are not allowed. It also provides some useful methods likecopyOf(Collection<E> c)
,of(E first, E... rest)
andcomplementOf(EnumSet<E> s)
.usingEnumSet()
方法显示java.util.EnumSet的使用,usingEnumSet()
是Set实现,用于枚举类型。 枚举集中的所有元素都必须来自创建集时明确或隐式指定的单个枚举类型。 EnumSet不同步,并且不允许使用null元素。 它还提供了一些有用的方法,例如copyOf(Collection<E> c)
,of(E first, E... rest)
和complementOf(EnumSet<E> s)
。
Reference: Oracle Doc
参考: Oracle文档
java中的枚举