Java -枚举类型 知识点总结和案例分享

1. 枚举类型-知识点总结:

枚举类型类的定义:

public enum Day{...}

Java使用关键字enum 声明定义类(该类被称为枚举类型-enum type),每个枚举类型的类都隐式的继承了Java中Enum类。同时也继承了Enum类中定义的所有方法。Java是单继承,所以所有枚举类都不能在继承其他类。

下表列出了在Enum类中定义的方法。

  • public final String name()
    返回枚举常量的名称。
  • public final int ordinal()
    返回枚举常量的顺序。
  • public final boolean equals(Object other)
    如果指定的对象等于枚举常量,则返回true。否则,它返回false。 ==运算符和equals()方法返回相同的结果,当它们用于两个枚举常量。
  • public final int hashCode()
    返回枚举常量的哈希码值。
  • public final int compareTo(E o)
    将此枚举常量与指定的枚举常量进行比较。它返回此枚举常量和指定的枚举常量的序数值的差异。
  • public final Class getDeclaringClass()
    返回声明枚举常量的类的类对象。
  • public String toString()
    默认情况下,它返回枚举常量的名称,这与name()方法相同。
  • public static valueOf(Class enumType,String name)返回指定的枚举类型和名称的枚举常量。

例子

Level  lowLevel = Enum.valueOf(Level.class, "LOW")

以下代码显示了如何比较两个枚举常量的前后顺序:

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    Level s1 = Level.LOW;
    Level s2 = Level.HIGH;

    // s1.compareTo(s2) returns s1.ordinal() - s2.ordinal()
    int diff = s1.compareTo(s2);
    if (diff > 0) {
      System.out.println(s1 + "  occurs after  " + s2);
    } else {
      System.out.println(s1 + "  occurs before " + s2);
    }

  }
}
上面的代码生成以下结果:
LOW occurs before HIGH
 


Note:Values() 方法:

该方法不是从Enum类继承而来的,这个方法是编译器插入到enum定义中的static方法,因此也可以通过枚举类名直接调用values()方法。



2. 枚举类型 - 类体中常量,字段,方法的定义。

在enum关键字定义的枚举类类体中,也可以定义变量,构造函数,方法。

常量(constant)

  • 枚举类常量一般定义在类体开头部分,并且最好是全大写方式,如果枚举类中不包含自定义属性和方法,那么可以简写成如下格式。
  • 在创建枚举类 常量时,默认调用Enum类的构造函数 Enum(String name, int ordinal)  name 以常量名传入,ordinal是按照定义常量的顺序,依次从0开始递增。
  • SUNDAY 表示调用Day枚举类无参构造函数创建名为SUNDAY的常量。如果是调用有参函数创建,则可以用SUNDAY(args)来创建枚举类常量。

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY 
}
  •  如果枚举类中包含自定义的变量和方法,那么在枚举类常量末尾必须以分号;作为结束。如下面示例

public enum Level { 

LOW(30), MEDIUM(15), HIGH(7), URGENT(1); 

// Declare an instance variable 
private int levelValue; 

// Declare a private constructor 
private Level(int levelValue) { 
    this.levelValue = levelValue; 
}
 public int getLevelValue() {
    return levelValue; 
}
}

构造函数(constructor):

枚举类型的类体中可以创建多个构造函数,但是构造函数的访问修饰符必须是private, 不能使用protected和public 定义。我们不能使用new constructor()的方式去创建枚举类型的实例。

即:

Level level = new Level(1); // 这段代码将会引起编译错误。

在枚举类型中,它的实例只有在类体开头定义的枚举常量,可以通过如下方式,定义枚举类型的变量。

Level low = Level.LOW; 
Level medium = Level.MEDIUM; 
Level high = Level.HIGH; 
Level urgent = Level.URGENT;

示例:

public enum Level { 

LOW(30), MEDIUM(15), HIGH(7), URGENT(1); 

// Declare an instance variable 
private int levelValue; 

// Declare a private constructor 
private Level(int levelValue) { 
    this.levelValue = levelValue; 
}
 public int getLevelValue() {
    return levelValue; 
}
}

2. 枚举类型 -案例使用

1. 枚举类型的类因为已经继承了Enum类,所以不能继承其他类,但是可以实现接口。如下代码

public interface Behaviour {
    void print();

    String getInfo();
}

public enum Color implements Behaviour {
    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 getInfo() {
        return this.name;
    }

    // 接口方法
    @Override
    public void print() {
        System.out.println(this.index + ":" + this.name);
    }
}

2. 枚举类型的类因为构造函数是私有化,不能被外部继承,但是可以通过内部类方式实现枚举类中的抽象方法。

package com.test;

public enum Operator {
    
    PLUS("+"){
        
        @Override
        public String execute(String value1, String value2) {
            int oper1=Integer.parseInt(value1);
            int Oper2=Integer.parseInt(value2);
            return Integer.valueOf(oper1+Oper2).toString();
        }

    }, SUBSTRACT("-"){
        
        @Override
        public String execute(String value1, String value2){
            int oper1=Integer.parseInt(value1);
            int Oper2=Integer.parseInt(value2);
            return Integer.valueOf(oper1-Oper2).toString();
        }
    }, MULTIPLY("×"){
        
        @Override
        public String execute(String value1, String value2){
            int oper1=Integer.parseInt(value1);
            int Oper2=Integer.parseInt(value2);
            return Integer.valueOf(oper1*Oper2).toString();
        }
    },DEVIDE("÷"){
        
        @Override
        public String execute(String value1, String value2){
            int oper1=Integer.parseInt(value1);
            int Oper2=Integer.parseInt(value2);
            return Integer.valueOf(oper1/Oper2).toString();
        }
    };
    
    private String desc;
    
    private Operator(String desc){
        this.desc=desc;
    }

    @Override
    public String toString() {
        return desc;
    }
    
    
    public abstract String execute(String value1, String value2);
}

3. 使用接口组织枚举

public interface Food {
    enum Coffee implements Food {
        BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
    }

    enum Dessert implements Food {
        FRUIT, CAKE, GELATO
    }
}

如果需要扩展enum中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。

4. 使用枚举创建的单例模式:

public enum EasySingleton{
    INSTANCE;
}
  • 1
  • 2
  • 3

代码就这么简单,你可以使用EasySingleton.INSTANCE调用它,比起你在单例中调用getInstance()方法容易多了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值