Java枚举类Enum简介:
1、特征:
(1)它不能有public或protected的构造函数,这样保证了用户不能创建一个新enum实例;
(2)所有枚举值都是public,static,final的,这一点只是针对于枚举值,可以和在普通类里面定义变量一样定义其任何类型的非枚举变量,这些变量可以用任何修饰符;
(3)Enum默认实现了java.lang.Comparable接口;
(4)Enum覆盖了toString()方法,因此我们如果调用Color.Blue.toString()默认返回字符串"Blue";
(5)Enum提供了一个valueOf方法,这个方法和toString方法是相对的,调用valueOf("Blue")将返回Color.Blue,因此在重写toString方法的时候一般相对应的重写valueOf方法;
(6)Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值;
(7)Enum还提供了一个ordinal的方法,这个方法返回枚举值在枚举类中的顺序,这个顺序根据枚举值声明的顺序而定,这里的Color.Red.ordinal()返回0,默认从0开始;
2、用法:
(1)常量:
public enum Color{
RED,GREEN,BLANK,YELLOW
}
(2)switch
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;
}
}
}
(3)像枚举中添加新的方法:如果定义自己的方法,则需要在enum实例序列的最后一个添加一个分号,而且enum实例必须先定义;
public enum Color{
RED("红色",1),GREEN("绿色",2),BLANK("白色",3),YELLOW("黄色",4);
//成员变量
private String name;
private int index;
//构造方法
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;
}
}
(4)覆盖枚举的方法:仅以toString()为例
public class Test{
public enum Color{
RED("红色",1),GREEN("绿色",2),BLANK("白色",3),YELLOW("黄色",4);
//成员变量
private String name;
private int index;
//构造方法
private Color(String name,int index){
this.name = name;
this.index = index;
}
//覆盖方法
public String toString(){
return this.index +"_"+this.name;
}
}
public static void main(String[] args){
System.out.println(Color.RED.toString());
}
}
(5)实现接口:由于所有枚举都继承java.lang.Enum类,故枚举不能再继承其他类(Java单一继承)
public interface Behaviour{
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED("红色",1),GREEN("绿色",2),BLANK("白色",3),YELLOW("黄色",4);
//成员变量
private String name;
private 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);
}
}
(6)使用接口组织枚举
public interface Food{
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT,CAKE,GELATO
}
}
(7)枚举集合使用:
1、特征:
(1)它不能有public或protected的构造函数,这样保证了用户不能创建一个新enum实例;
(2)所有枚举值都是public,static,final的,这一点只是针对于枚举值,可以和在普通类里面定义变量一样定义其任何类型的非枚举变量,这些变量可以用任何修饰符;
(3)Enum默认实现了java.lang.Comparable接口;
(4)Enum覆盖了toString()方法,因此我们如果调用Color.Blue.toString()默认返回字符串"Blue";
(5)Enum提供了一个valueOf方法,这个方法和toString方法是相对的,调用valueOf("Blue")将返回Color.Blue,因此在重写toString方法的时候一般相对应的重写valueOf方法;
(6)Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值;
(7)Enum还提供了一个ordinal的方法,这个方法返回枚举值在枚举类中的顺序,这个顺序根据枚举值声明的顺序而定,这里的Color.Red.ordinal()返回0,默认从0开始;
2、用法:
(1)常量:
public enum Color{
RED,GREEN,BLANK,YELLOW
}
(2)switch
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;
}
}
}
(3)像枚举中添加新的方法:如果定义自己的方法,则需要在enum实例序列的最后一个添加一个分号,而且enum实例必须先定义;
public enum Color{
RED("红色",1),GREEN("绿色",2),BLANK("白色",3),YELLOW("黄色",4);
//成员变量
private String name;
private int index;
//构造方法
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;
}
}
(4)覆盖枚举的方法:仅以toString()为例
public class Test{
public enum Color{
RED("红色",1),GREEN("绿色",2),BLANK("白色",3),YELLOW("黄色",4);
//成员变量
private String name;
private int index;
//构造方法
private Color(String name,int index){
this.name = name;
this.index = index;
}
//覆盖方法
public String toString(){
return this.index +"_"+this.name;
}
}
public static void main(String[] args){
System.out.println(Color.RED.toString());
}
}
(5)实现接口:由于所有枚举都继承java.lang.Enum类,故枚举不能再继承其他类(Java单一继承)
public interface Behaviour{
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED("红色",1),GREEN("绿色",2),BLANK("白色",3),YELLOW("黄色",4);
//成员变量
private String name;
private 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);
}
}
(6)使用接口组织枚举
public interface Food{
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT,CAKE,GELATO
}
}
(7)枚举集合使用:
java.util.EnumSet和java.util.EnumMap,Enum.Set保证集合中的元素不重复,EnumMap中的key是enum类型,而value可以是任意类型;
3、valueOf使用注意事项
valueOf是将String转为Enum实例,存在如果String不存在的情况,Enum为了不产生空枚举对象,则抛出无效参数异常(IllegalArgumentException),为了避免异常报错,我们 可以对枚举进行扩展,如下实例:
enum Season{
Spring,Summer,Autumn,Winter;
//是否包含指定名称的枚举项
public static boolen contains(String name){
//所有枚举值
Season[] season = values();
//遍历查找
for(Season s: season){
if(s.name().equals(name)){
return true;
}
}
return false;
}
}
参考:https://www.cnblogs.com/toSeeMyDream/p/5825486.html
https://www.jianshu.com/p/b49b8d02f5c5
https://www.cnblogs.com/DreamDrive/p/5632706.html