Java枚举(1):详解7种常见的⽤法
⽬录
JDK1.5引⼊了新的类型——枚举。在 Java 中它虽然算个“⼩”功能,却给我的开发带来了“⼤”⽅便。
⽤法⼀:常量
在JDK1.5 之前,我们定义常量都是: public 。现在好了,有了枚举,可以把相关的常量分组到⼀个枚举类型⾥,⽽且枚举提供了⽐常量更多的⽅法。
Java代码
public enum Color {
RED, GREEN, BLANK, YELLOW
}
⽤法⼆:switch
JDK1.6之前的switch语句只⽀持int,char,enum类型,使⽤枚举,能让我们的代码可读性更强。
Java代码
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
⽤法三:向枚举中添加新⽅法
如果打算⾃定义⾃⼰的⽅法,那么必须在enum实例序列的最后添加⼀个分号。
⽽且 Java 要求必须先定义 enum 实例。
Java代码
public enum Color {
RED("红⾊", 1), GREEN("绿⾊", 2), BLANK("⽩⾊", 3), YELLO("黄⾊", 4); // 成员变量
private String name;
private int index;
// 构造⽅法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
/
/ 普通⽅法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set ⽅法
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;
}
}
⽤法四:覆盖枚举的⽅法
下⾯给出⼀个toString()⽅法覆盖的例⼦。
Java代码
public enum Color {
RED("红⾊", 1), GREEN("绿⾊", 2), BLANK("⽩⾊", 3), YELLO("黄⾊", 4); // 成员变量
private String name;
private int index;
// 构造⽅法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//覆盖⽅法
@Override
public String toString() {
return this.index+"_"+this.name;
}
}
⽤法五:实现接⼝
所有的枚举都继承⾃java.lang.Enum类。由于Java 不⽀持多继承,所以枚举对象不能再继承其他类。 Java代码
public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED("红⾊", 1), GREEN("绿⾊", 2), BLANK("⽩⾊", 3), YELLO("黄⾊", 4);
// 成员变量
private String name;
java switch case stringprivate int index;
// 构造⽅法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接⼝⽅法
@Override
public String getInfo() {
return this.name;
}
//接⼝⽅法
@Override
public void print() {
System.out.println(this.index+":"+this.name);
}
}
⽤法六:使⽤接⼝组织枚举
Java代码
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}
/**
* 测试继承接⼝的枚举的使⽤(by ⼤师兄 or ⼤湿胸。)
*/
private static void testImplementsInterface() {
for (Food.DessertEnum dessertEnum : Food.DessertEnum.values()) {
System.out.print(dessertEnum + " ");
}
System.out.println();
//我这地⽅这么写,是因为我在⾃⼰测试的时候,把这个coffee单独到⼀个⽂件去实现那个food接⼝,⽽不是在那个接⼝的内部。
for (CoffeeEnum coffee : CoffeeEnum.values()) {
System.out.print(coffee + " ");
}
System.out.println();
//搞个实现接⼝,来组织枚举,简单讲,就是分类吧。如果⼤量使⽤枚举的话,这么⼲,在写代码的时候,就很⽅便调⽤啦。
//还有就是个“多态”的功能吧,
Food food = Food.DessertEnum.CAKE;
System.out.println(food);
food = CoffeeEnum.BLACK_COFFEE;
System.out.println(food);
}
运⾏结果
⽤法七:关于枚举集合的使⽤
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,⽽value则可以是任意类型。关于这个两个集合的使⽤就不在这⾥赘述,可以参考JDK⽂档。
下⾯是我⾃⼰的测试代码。
package umTest;
/**
* Java枚举⽤法测试
* <p>
* Created by lxk on 2016/12/15
*/
public class EnumTest {
public static void main(String[] args) {
forEnum();
useEnumInJava();
}
/**
* 循环枚举,输出ordinal属性;若枚举有内部属性,则也输出。(说的就是我定义的TYPE类型的枚举的typeName属性)
*/
private static void forEnum() {
for (SimpleEnum simpleEnum : SimpleEnum.values()) {
System.out.println(simpleEnum + " ordinal " + dinal());
}
System.out.println("------------------");
for (TYPE type : TYPE.values()) {
System.out.println("type = " + type + " type.name = " + type.name() + " typeName = " + TypeName() + " ordinal = " + dinal()); }
}
}
/**
* 在Java代码使⽤枚举
*/
private static void useEnumInJava() {
String typeName = "f5";
TYPE type = TYPE.fromTypeName(typeName);
if (TYPE.BALANCE.equals(type)) {
System.out.println("根据字符串获得的枚举类型实例跟枚举常量⼀致");
} else {
System.out.println("⼤师兄代码错误");
}
}
/**
* 季节枚举(不带参数的枚举常量)这个是最简单的枚举使⽤实例
* Ordinal 属性,对应的就是排列顺序,从0开始。
*/
private enum SimpleEnum {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
/**
* 常⽤类型(带参数的枚举常量,这个只是在书上不常见,实际使⽤还是很多的,看懂这个,使⽤就不是问题啦。) */
private enum TYPE {
FIREWALL("firewall"),
SECRET("secretMac"),
BALANCE("f5");
private String typeName;
TYPE(String typeName) {
}
/**
* 根据类型的名称,返回类型的枚举实例。
*
* @param typeName 类型名称
*/
public static TYPE fromTypeName(String typeName) {
for (TYPE type : TYPE.values()) {
if (TypeName().equals(typeName)) {
return type;
}
}
return null;
}
public String getTypeName() {
peName;
}
}
}
然后是测试的结果图:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论