枚举类

Posted by 麦子 on Monday, 2020年04月20日

[TOC]

简介

转载:https://www.cnblogs.com/alter888/p/9163612.html

实际上在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API中的java.lang.Enum类,也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类。

构造器和抽象方法

public enum Calculator { 
    // 加法运算
    ADD("+") {
        public int exec(int a, int b) {

            return a + b;
        }
    }, 
    // 减法运算
    SUB("-") {
        public int exec(int a, int b) {

            return a - b;
        }
    };

    String value = "";

    // 定义成员值类型
    private Calculator(String _value) {

        this.value = _value;
    }

    // 获得枚举成员的值
    public String getValue() {

        return this.value;
    }

    // 声明一个抽象函数
    public abstract int exec(int a, int b);
}

实现接口

public interface CheckTypeInterface {

    void checkType();

}
public enum Ifelse implements CheckTypeInterface {
    ADD {
        @Override
        public void checkType() {
            System.out.println("加法处理");
        }
    },

    SUB {
        @Override
        public void checkType() {
            System.out.println("减法处理");
        }
    };
}
public class IfelseMain {
    public static void main(String[] args) {
        String str = "ADD";
        System.out.println(Ifelse.valueOf(str));
        System.out.println(Ifelse.ADD);
        System.out.println(Ifelse.valueOf(str).getClass());
        System.out.println(Ifelse.ADD.getClass());
        Ifelse.valueOf(str).checkType();
    }

    public void name(String str) {
        String name = "ADD";
        System.out.println("fffsssssss少时诵诗书说收缩sssssss");
    }
}

运行结果

ADD
ADD
class app.Ifelse$1
class app.Ifelse$1
加法处理

枚举单例模式

转载:https://www.cnblogs.com/saoyou/p/11087462.html 无法反射详情解释

事实上,通过Java反射机制是能够实例化构造方法为private的类的。这也就是我们现在需要引入的枚举单例模式。

public class User {
    private String username;
    private String password;
}
public enum EnumSingleton {

    INSTANCE;

    private User user;

    private EnumSingleton() {
        user = new User();
        user.setUsername("麦子");
        user.setPassword("123");
    }

    public User getInstance() {
        return user;
    }

    public static void main(String[] args) {

        System.out.println(EnumSingleton.INSTANCE);
        System.out.println(EnumSingleton.INSTANCE.getInstance());

        User singleton1 = EnumSingleton.INSTANCE.getInstance();
        User singleton2 = EnumSingleton.INSTANCE.getInstance();
        System.out.println("正常情况下,实例化两个实例是否相同:" + (singleton1 == singleton2));
    }
}

运行结果

INSTANCE
app.User@7852e922
正常情况下实例化两个实例是否相同true

Enum抽象类常见方法

Enum是所有 Java 语言枚举类型的公共基本类(注意Enum是抽象类),以下是它的常见方法:

返回类型 方法名称 方法说明
int compareTo(E o) 比较此枚举与指定对象的顺序
boolean equals(Object other) 当指定对象等于此枚举常量时,返回 true。
Class<?> getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象
String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
String toString() 返回枚举常量的名称,它包含在声明中
static<T extends Enum<T>> T static valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。

总结

感觉他和其他的类在具体写法上没有什么具体的区别,只是他可以抵御反射攻击。

「真诚赞赏,手留余香」

真诚赞赏,手留余香

使用微信扫描二维码完成支付