Java 基础 之 枚举类型

简介:

创建一个简单的枚举类。

public enum EnumNumber {
    ONE,TWO,THREE;
}

创建 enum 时,编译器会给你生成一个相关的类,这个类继承了  java.lang.Enum 类,相当于:

public final class EnumNumber extends Enum {}

所以,枚举类型不能继承其他的类,否则会报:枚举不允许扩展子句 错误

final 修饰,所以 不能被其他类继承。

这个类继承了  java.lang.Enum 类,该类实现了 Comparable 和  Serializable 接口。

所以 可以使用 compareTo 方法 和 进行序列化

方法:

枚举类型 可以定义构造方法:

public enum EnumNumber {
    ONE("张飞"),TWO("关羽"),THREE("刘备");

    private String name;

    EnumNumber(String name) {
        this.name = name;
    }
}

也可以定义抽象方法:

public enum EnumNumber {
    ONE("张飞") {
        @Override
        public void test() {
            System.out.println("张飞...");
        }
    },TWO("关羽") {
        @Override
        public void test() {
            System.out.println("关羽...");
        }
    },THREE("刘备") {
        @Override
        public void test() {
            System.out.println("刘备...");
        }
    };

    private String name;

    EnumNumber(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public abstract void test();
}

再来看看枚举类有那些方法供我们使用:

 valueOf 方法:返回 指定的 enum 实例。

EnumNumber enumNumber = EnumNumber.valueOf("TWO");
System.out.println(enumNumber.getName());
// 调抽象方法
enumNumber.test();

values 方法:返回 enum 实例数组。

EnumNumber[] arr = EnumNumber.values();
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i].getName());
    // 调抽象方法
    arr[i].test();
}

 ordinal 方法:返回 enum 实例声明的顺序,从 0 开始。

EnumNumber enumNumber = EnumNumber.valueOf("TWO");
System.out.println(enumNumber.ordinal());

 

还有我们常见 toStringhashCodeequals 等方法。

 使用 EnumSet :

public static void main(String[] args) {
    EnumSet<EnumNumber> noneOfSet = EnumSet.noneOf(EnumNumber.class);
    EnumSet<EnumNumber> allOfSet = EnumSet.allOf(EnumNumber.class);
    System.out.println(noneOfSet);
    System.out.println(allOfSet);
}

noneOf 方法:创建一个空的 EnumSet 集合。
allOf 方法:创建一个包含 EnumNumber 所有实例的 EnumSet 集合。

因为 enum 要求其实例都是唯一,所以只能向 EnumSet 集合添加不重复的对象。

 使用 EnumMap :

public static void main(String[] args) {
    EnumMap<EnumNumber,String> enumMap = new EnumMap(EnumNumber.class);
    enumMap.put(EnumNumber.ONE, "张飞");

    System.out.println(enumMap.get(EnumNumber.ONE));
    System.out.println(enumMap.get(EnumNumber.TWO));
}

enum 的每个实例作为 key,如果没有 put 进去取出来都为 null

 2、EnumMap 的 key 必须来自一个 enum

最后, enum 实例的顺序决定了 EnumMap 和 EnumSet 中的顺序。

public static void main(String[] args) {
    EnumMap enumMap = new EnumMap(EnumNumber.class);
    enumMap.put(EnumNumber.TWO, "关羽");
    enumMap.put(EnumNumber.ONE, "张飞");
    System.out.println(enumMap);

    EnumSet<EnumNumber> enumSet = EnumSet.noneOf(EnumNumber.class);
    enumSet.add(EnumNumber.TWO);
    enumSet.add(EnumNumber.ONE);
    System.out.println(enumSet);
}

单例:

public class Singleton {
    private static Singleton singleton;

    // 私有的构造方法
    private Singleton(){}

    public static synchronized Singleton getSingleton(){
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

}

虽然把构造方法私有化了,但是还是避免不了会创建多个实例的情况。通过反射就可以做到。

所以使用枚举就可以解决这个问题了。

猜你喜欢

转载自blog.csdn.net/m_crayon/article/details/106651932