Enum in java with java enum examples
Enum in java
This tutorial consists of introduction to enum in java, java enum example (s), need of enum class in java with enum example. Enum in java or enums in java introduced in J2SE 5 , but what is enum in java? when to use enum in java, how to use enum in java , how to declare enum in java? how to serialize enum in java? how to sort enum in java? how to use java enum constructor ? there are lots of questions isn’t it? Lets look at how we can use enum in java. Enum in java are nothing but set of fields with set of fixed constants.Before enum introduced in java , there were constants defined in the class as follows :
1
2
3
4
5
| public Class ConstantPool{ public static final int TCP_PORT = 123 ; public static final int DNS_PORT = 139 ; public static final int LDAP_PORT = 922 ; } |
The approach of defining set of constant values are some serious drawbacks, lets see which are those and enum in java comes for help.
1. Missing type-safety :
First and foremost it is not type-safe. You are allowed to assign any port value which is not actual port value. Thus these constant can allow illegal values.
2. Missing Significant printing
Significant printing of the constant is missing from the way of defining constants using static final scheme. Like when we print the constant it will print the value such as 123 not TCP_PORT.
3. I/O on final static Strings not easy.
For converting values from String to I/O operations is not easy.
4. No behaviour of its own
Constant Strings defined by static and final are only values there is no behaviour associated with it.
Enum in java or enums in java helps in overcoming these limitations.
Enum in Java
Now lets see what is enum in java and how it helps in improving programming. Enum is like a class or an interface which keeps fixed set of constants, which we call as enum constants. Lets see how we can define the Enum constants :// Java enum example 1.
1
2
3
4
5
| public enum Ports{ TCP, DNS, LDAP }; |
Now if we closely look at the code snippet above we can see that curly braces are like classes and interfaces. Also enum word is used like class or an interface. Naming convention is like a Class and and inter face too.
Enum constants are implicitly static and final. That means you cannot change the constant value again.
Another thing to watch for is if you were using java 1.4 and you have used enum as variable name , it will fail in case of java 1.5.
Now lets see benefits of using enum in java :
1. Unlike using array of Strings , we can use enums as case labels.
2. Enum in java are type safe.
3. If you are using lower version than java 7, then you can use enum in Switch statement.
4. We can easily add additional fields to the enum in java.
5. Enum in java uses its own namespace.
6. We can compare enums easily with ==.
7. Enum in java helps in reducing the bugs in our code. Lets see how if you have different ports but you want to restrict some of the ports such as reserved ports. So when you make constants using enum in java, compiler will restrict you from assigning the different ports other than TCP, DNS and LDAP.
Enum in java are typesafe.
Enum in java uses its own namespace.
Declaration of enum in java :
Enums can be declared as their own separate class or as a class member. First we will see declaring enum in java outside a class :
// Java enum example 2. Declaration of enum in java
1
2
3
4
5
6
7
8
9
10
| enum Ports { TCP, DNS, LDAP } // Declaring enum outside the class. class PortSpec { Ports ports; } public class testPortSpec { public static void main( String[] args ){ PortSpec portSpec = new PortSpec(); portSpec.port = Ports.TCP; // Using enum which is outside the class. } } |
Enum in java need to be declared with only the public or default modifier.
Java Enum Example 3 : Declaring enum inside the class
1
2
3
4
5
6
7
8
9
10
| class PortSpec { enum Ports { TCP, DNS, LDAP } // Declaring enum inside the class. Ports ports; } public class testPortSpec { public static void main( String[] args ){ PortSpec portSpec = new PortSpec(); portSpec.port = PortSpec. Ports.TCP; // Using enum which is inside the class PortSpec. } } |
Enum constant must not be declared inside a method .
Java Enum Example 4 : Declaring enum inside the class is wrong.
1
2
3
4
5
6
7
| public class testPortSpec { public static void main( String[] args ){ enum Ports { TCP, DNS, LDAP } // Wrong ! PortSpec portSpec = new PortSpec(); portSpec.port = Ports.TCP; // } } |
Convention for enum in java :
Common convention is enum constant to be in all UPPERCASE.
So far we seen how to declare the enum constants, but you must be curious to know what gets created when we make an enum in java. In above code snippet as we can see each of the enum declared in Ports is actually instances of Class Ports i.e. TCP is type of Ports like
public static final Ports TCP = new Ports( “TCP”, 123 );
Here you can see that it has been declared as static and final which we assume it is a constant.
Now lets see some of the key features of enum in java .
1. Declaring a constructor in enum in java
We can specify value to the enum constant at the time of creation. We can create the constructor to specify the value as shown below :
Java Enum Example 5 : Constructor of enum in java is declared as private
1
2
3
4
5
6
7
| public class Ports{ TCP( 123 ), UDP( 345 ), LDAP( 555 ); public int portNumber; private Ports( int portNumber ){ //Access modifier private this .portNumber = portNumber; } }; |
Java enum constructor :
Constructor of enum in java should be declared as private.
Also to get the value associated with constant we can add getValue() method which will give
the value associated with it.
2 As we seen above, as constructor is private, we cannot create instance of enum using new operator. So Enum constants can only be created in Enum class itself. The enum constructor is invoked automatically, with the arguments you define after the constant value.
You can also pass more than one argument to the enum constructor in java, similarly overloading of enum constructor is also possible.
3.All enums and enum constant have some built in or predefined methods such as values() and valueOf()
1. Public static EnumType[] values()
This method returns the array of enumeration constants.
2. Public static EnumType valueOf( String str )
This method return enum constant which corresponds to the String passed as an argument.
Java Enum Example 6 : Example of values() method in enum in java.
1
2
3
4
| Ports allPorts[] = Port.values(); // Returns array of enum constants. For( Ports portNumber : allPorts ){ System.out.println( portNumber ); } |
1
|
Ports port = Port.valueOf(“TCP”); // Returns enum constant for TCP |
Also enum values are case sensitive so make sure you pass correct case parameter with doing trom() to valueOf function.
5.
Ordinal in enum in java
:Ordinal in enum in java means the position in enum declaration. We don’t need to assign ordinals manually. These ordinals are self numbered. Ordinal values can be found out by using ordinal() method.
Java Enum Example 8 : Java enum ordinal example
1
2
3
| for ( Ports portNumber : allPorts ) { System.out.println( portNumber.ordinal() ); } |
Java Enum Example 9 : How to get enum constant from the ordinal in enum in java.
1
| Port portNo = Port.values()[ ordinal ]; |
Following program demonstrates the use of equality operator in enum in java.
1
2
3
4
| Port tcpPort = Port.TCP; If( tcpPort == Port.TCP ){ System.out.println( "Ports are equal"); } |
Enum in java can be used as an argument to the Switch statement to be used as a case as we use it in case of int and char type. Before Java 7 we were not using String in Switch case statement. (Java 7 uses String in Switch statement) but for some reason if you are not using java 7 and above then enum makes a great option to be used in Switch statement.
Java Enum Example 9 : java enum switch example
Port portNumber = Port.TCP; switch ( portNumber ){ case TCP: System.out.println( “TCP Port Found” ); case LDAP: System.out.println( “LDAP Port Found” ); }
|
Sorting of enums can be done in same way as we do in sorting of array in java. You can create the Comparator object and use it to sort the enum constants in java.
Java Enum Example 10 : Sorting of enum in java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| //Using util classes to sort enums import java.util.Arrays; import java.util.Comparator; import static java.lang.System.out; /** * This is an example of sorting or array of enums. * */ public class EnumSortExample { public static void main( String[] args ) { Ports[] portNames = { Ports.TCP, Ports.DNS, Ports.LDAP }; Arrays.sort( portNames ); // default sort for ( Ports portInfo : portNames ) { System.out.println( portInfo + " " + portInfo.getPortUidName() + " " +portInfo.ordinal() ); } // Default sorting is done according to the ordinal //TCP Tcp 0 //DNS Dns 1 //LDAP Ad 2 Arrays.sort( portNames, new PortUidOrder() ); // sort by port uid for ( Ports portInfo : portNames ) { System.out.println( portInfo + " " + portInfo.getPortUidName() + " " +portInfo.ordinal() ); } // displays in Latin name order //LDAP Ad 2 //DNS Dns 1 //TCP Tcp 0 } } /** * Enum for Ports */ enum Ports // { TCP( "Tcp" ), DNS( "Dns" ), LDAP( "Ad" ); final String portUidName; //Field name for storing port Uid name Ports( String uidName ) // Constructor { this .portUidName = uidName; } // GET / SET METHODS String getPortUidName() { return portUidName; } } /** *Creating Comparator class to sort enum by port uid */ class PortUidOrder implements Comparator<ports> { // Compare function to compare enums public final int compare( Ports a, Ports b ) { return a.portUidName.compareToIgnoreCase( b.portUidName ); // Comparing the enums using compareToIgnoreCase } } </ports> |
Serialization of java enum
Serialization of java enum means converting java enum to a value which can be either primitive or String to store it easily either in database or file or disk. Deserialization is the process where stored value read back and converted to enum.Lets see how enum in Java can be serialized :
1. Using user defined value ( Most recommended )
In this approach of serialization and de- serialization user defines one custom value to each enum constant and use toValue() and fromValue() functions to get the constant back. This approach is more dependable as it do not depend upon the ordering of the enum constant or the enum constant itself.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| //Following code snippet shows use of toValue() and fromValue() functions public enum Ports { TCP( "TCP" ), DNS( "DNS" ), LDAP( "AD" ), UNKNOWN( "UNKNOWN" ); private final String value; Ports( String value ) { this .value = value; } // Usiing fromValue method to get the actual port public static Ports fromValue(String value ) { if ( value != null ) { for ( Ports port : values() ) { if (port.value.equals( value )) { return port; } } } //here you can either return default or throw illegal argument exception } public String toValue() { return value; } } |
1
2
| Ports port = Ports.TCP; String savedPort = port.value(); //Serialization done using value() |
1
| Ports savedPortEnum = Ports.fromValue( savedPort ); |
We can use name() method to get the enum constant value. Lets see how we are serializing the enum constant using this approach :
1
2
| Ports port = Ports.TCP; String savedPort = port.name(); |
1
| Port savedPortEnum = Ports.valueOf( savedPort ); |
Overriding toString in enum in java
Sometimes we need custom values for enum constants. To achive this we can use or override toString method. Overriding should be done only when we need more programmer friendly String to be used.Enum implementing an interface :
1.Enum in java implicitly implements Comparable and Serializable interfaces.
2. But why would an enum implement an interface?
Enum in java don’t just provide set of passive constants. They may also have a complex functionality or behaviour.
3. How to implement interface using enum in java?
Lets see how we can implement an interface using java enum.
1
2
3
4
5
6
7
8
| public enum Ports implements Connectable(){ TCP( 123 ), UDP( 345 ), LDAP( 555 ); public void connect(){ ...... } } |
0 comments:
Post a Comment