JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。
在JDK1.5 之前,我们定义常量都是: public static final.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
Java代码
public enum Color
{
RED, GREEN, BLANK, YELLOW
}
测试代码
public class Test
{
public static void main(String[] args)
{
Color red = Color.RED;
System.out.println(red);
}
}
输出RED
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
Java代码
public class EnumTest
{
public static void main(String[] args)
{
ColorEnum color = ColorEnum.RED;
switch (color)
{
case RED:
color = color.RED;
break;
case GREEN:
color = color.BLANK;
break;
case YELLOW:
color = color.YELLOW;
break;
}
System.out.println(color);
}
}
输出RED;
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。
java代码
public enum ColorEnum
{
RED("红色", 1), GREEN("绿色", 2), BLANK("黑色", 3), YELLOW("黄色", 4);
private String name;
private int index;
private ColorEnum(String name , int index)
{
this.name = name;
this.index = index;
}
public static String getName(int index)
{
for (ColorEnum color : ColorEnum.values())
{
if (color.index == index)
{
return color.name;
}
}
return null;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getIndex()
{
return index;
}
public void setIndex(int index)
{
this.index = index;
}
}
测试代码:
public class EnumTest
{
public static void main(String[] args)
{
for(int i=1; i <=4; i++)
{
test(i);
}
}
public static void test(int index)
{
String name = ColorEnum.getName(index);
System.out.println(name);
}
}
输出:分别输出 红色,绿色,黑色,黄色
下面给出一个toString()方法覆盖的例子。
java代码:
public enum ColorEnum
{
RED("红色", 1), GREEN("绿色", 2), BLANK("黑色", 3), YELLOW("黄色", 4);
private String name;
private int index;
private ColorEnum(String name, int index)
{
this.name = name;
this.index = index;
}
// 覆盖方法
@Override
public String toString()
{
return this.index + "_" + this.name;
}
}
测试代码:
public class EnumTest
{
public static void main(String[] args)
{
test();
}
public static void test()
{
ColorEnum[] values = ColorEnum.values();
for (ColorEnum color : values)
{
String c = color.toString();
System.out.println(c);
}
}
}
输出:分别输出 1_红色, 2_绿色, 3_黑色, 4_黄色;
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
java代码:
public interface Behaviour
{
void print();
String getInfo();
}
public enum ColorEnum implements Behaviour
{
RED("红色", 1), GREEN("绿色", 2), BLANK("黑色", 3), YELLOW("黄色", 4);
private String name;
private int index;
private ColorEnum(String name, int index)
{
this.name = name;
this.index = index;
}
@Override
public void print()
{
System.out.println("输出方法");
}
@Override
public String getInfo()
{
return this.index + "_" + this.name();
}
}
测试代码:
public class EnumTest
{
public static void main(String[] args)
{
test();
}
public static void test()
{
ColorEnum[] values = ColorEnum.values();
for (ColorEnum color : values)
{
String c = color.getInfo();
System.out.println(c);
}
}
}
输出:分别输出 1_红色, 2_绿色, 3_黑色, 4_黄色
java代码
public interface Food{
enum CoffeeEnum implements Food
{
BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
}
enum DessertEnum implements Food
{
FRUIT, CAKE, GELATO
}
}
测试代码:
public class InterfaceEnum
{
public static void main(String[] args)
{
DessertEnum[] values = Food.DessertEnum.values();
for (DessertEnum dessert : values)
{
System.out.println(dessert + " ");
}
System.out.println("=====");
for (CoffeeEnum coffee : Food.CoffeeEnum.values())
{
System.out.println(coffee + " ");
}
System.out.println("=====");
//搞个实现接口,来组织枚举,简单讲,就是分类吧。
//如果大量使用枚举的话,这么干,在写代码的时候,就很方便调用啦。
//还有就是个"多态"的功能吧
Food food = Food.DessertEnum.CAKE;
System.out.println(food);
food = CoffeeEnum.BLACK_COFFEE;
System.out.println(food);
}
}
输出:分别输出 FRUIT CAKE GELATO =====BLACK_COFFEE DECAF_COFFEE LATTE CAPPUCCINO ===== CAKE BLACK_COFFEE
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。
关于枚举的实现细节和原理请参考:
参考资料:《ThinkingInJava》第四版
多说一句,用法4,用法5,枚举实例多个参数也是可以的:
public enum ColorEnum implements Behaviour
{
RED("红色", "这是红色", 1), GREEN("绿色", "这是绿色", 2), BLANK("黑色", "这是黑色", 3), YELLOW("黄色", "这是黄色", 4);
}
转自:https://blog.csdn.net/qq_27093465/article/details/52180865