Where you want to restrict the user to providing input from a predefined list.
you might want the user to choose from a set of constants defining several printer types:
public static final int DOTMATRIX = 1;
public static final int INKJET = 2;
public static final int LASER = 3;
Enumerations are sets of closely related items, for example:
- Directions - north, south, east, west
- Types of novels - mystery, classic, fantasy, romance, science-fiction
- Flavours of ice cream - chocolate, vanilla, raspberry, maple
Alternative to the simple String or int constants used to represent sets of related items.
Points to Remember
- enums are implicitly final subclasses of java.lang.Enum
- if an enum is a member of a class, it's implicitly static
- new can never be used with an enum, even within the enum type itself
- name and valueOf simply use the text of the enum constants, while toString may be overridden to provide any content, if desired
- for enum constants, equals and == amount to the same thing, and can be used interchangeably
- enum constants are implicitly public static final
- the order of appearance of enum constants is called their "natural order", and defines the order used by other items as well : compareTo, iteration order of values , EnumSet, EnumSet.range.
- enums have a built-in serialization mechanism, which can't be overridden. The mechanism uses the name and valueOf methods.
Example 1 - Basic
// define an enum for classifying printer types
enum PrinterType {
DOTMATRIX, INKJET, LASER
}
// test the enum now
public class EnumTest {
PrinterType printerType;
public EnumTest(PrinterType pType) {
printerType = pType;
}
public void feature() {
// switch based on the printer type passed in the constructor
switch(printerType){
case DOTMATRIX:
System.out.println("Dot-matrix printers are economical and almost obsolete");
break;
case INKJET:
System.out.println("Inkjet printers provide decent quality prints");
break;
case LASER:
System.out.println("Laser printers provide best quality prints");
break;
}
}
public static void main(String[] args) {
EnumTest enumTest = new EnumTest(PrinterType.LASER);
enumTest.feature();
}
}
Example 2 - member attributes and methods in an enum data type
PrinterType.java
public enum PrinterType {
DOTMATRIX(5), INKJET(10), LASER(50);
private int pagePrintCapacity;
private PrinterType(int pagePrintCapacity) {
this.pagePrintCapacity = pagePrintCapacity;
}
public int getPrintPageCapacity() {
return pagePrintCapacity;
}
}
// EnumTest.java
public class EnumTest {
PrinterType printerType;
public EnumTest(PrinterType pType) {
printerType = pType;
}
public void feature() {
switch (printerType) {
// omitted - refer previous example
case LASER:
System.out.println("Laser printers provide the best quality prints");
break;
}
System.out.println("Print page capacity per minute: " +
printerType.getPrintPageCapacity());
}
public static void main(String[] args) {
EnumTest enumTest1 = new EnumTest(PrinterType.LASER);
enumTest1.feature();
EnumTest enumTest2 = new EnumTest(PrinterType.INKJET);
enumTest2.feature();
}
}
However, the enum class cannot have a public constructor, or the compiler will complain with following message: "Illegal modifier for the enum constructor; only private is permitted."
A constructor in an enum class can only be specified as private.
Best Practices
Best Practices
public enum PrinterType {
DOTMATRIX(5), INKJET(10), LASER(50);
private int pagePrintCapacity;
private PrinterType(int pagePrintCapacity) {
this.pagePrintCapacity = pagePrintCapacity;
}
public int getPrintPageCapacity() {
return pagePrintCapacity;
}
public static pagePrintCapacity getPrinterType(int pagePrintCapacity)
for(PrinterType printerType: PrinterType.values()){
if(pagePrintCapacity == printerType.getValue() )
return pagePrintCapacity;
}
return null;
}
}
No comments:
Post a Comment