java----枚举

 枚举:

枚举这种类型占用内存空间大,根据需要选择枚举或者常量

每一个枚举元素都是一个对象

基本使用

class  ColorTest{
    //如果使用枚举,不需要再本类中定义...即使定义了,也用不到
//    private int red;
//    private int blue;
//    private int black;
//    private int color;
    private Color colorenum;
//    public void test(){
//        color = red;
//        color = 1;
//    }
    //从编码的角度(编译期),限制了colorenum的选择范围;
    public void test2(){
        //如果希望color强制只能为red,blue,black中的一种;不能是color = 1;
        colorenum = Color.red;
        //colorenum = 1;  此时会报错,编辑期不给通过

        System.out.println(colorenum);  //red
        System.out.println(colorenum.name()); //red
        System.out.println(colorenum.ordinal()); //2,枚举的序号;
        System.out.println(colorenum.toString());//red

        for (Color s:Color.values()) {
            System.out.println(s);
        }
    }
    public void test3(){
        //存放枚举的集合
        EnumSet<Color> colors = EnumSet.allOf(Color.class);
        for (Color c:colors){
            System.out.println(c);
        }
    }
    public void test4() {
        EnumMap<Color,String> map = new EnumMap<Color, String>(Color.class);
        map.put(Color.red,"111");
        map.put(Color.blue,"222");
        for (Color c:map.keySet()){
            System.out.println(c);
        }
    }
}

 

枚举构造方法

public class Demo{
    public static void main(String[] args) {
        ColorTest colorTest = new ColorTest();
        colorTest.test();
    }
}
enum Color {
    blue,black(10),red;
    //可以定义属性
    private int color;
    //只能定义私有的构造方法
    private Color(){
        System.out.println("无参构造器");
    }
    private Color(int color){
        this.color = color;
        System.out.println("有参构造器");
    }
}
class  ColorTest{
    private Color colorenum;
    public void test(){
        //用到枚举类型Color,所有的构造方法都会被调用
        colorenum = Color.red;
    }
}

 

让枚举实现接口 

Color.red  是一个对象,对象可以调用方法;

public class  Demo{
    public static void main(String[] args) {
        ColorTest colorTest = new ColorTest();
        colorTest.test();
    }
}
interface info{
    int getColor();
}
enum Color implements info{
    blue,black(10),red;
    //可以定义属性
    private int color;
    //只能定义私有的构造方法
    private Color(){
        System.out.println("无参构造器");
    }
    private Color(int color){
        this.color = color;
        System.out.println("有参构造器");
    }
    @Override
    public int getColor() {
        return this.color;
    }
}
class  ColorTest{
    private Color colorenum;
    public void test(){
        int num = Color.red.getColor();
        System.out.println(num);
        int num2 = Color.black.getColor();
        System.out.println(num2);
    }
}

再枚举中定义抽象方法

public class Demo{
    public static void main(String[] args) {
        ColorTest colorTest = new ColorTest();
        colorTest.test();
    }
}
enum Color {
    blue {
        @Override
        public String getColorName() {
            return "blue";
        }
    },black() {
        @Override
        public String getColorName() {
            return "black";
        }
    },red {
        @Override
        public String getColorName() {
            return "red";
        }
    };
    public abstract String getColorName();
}
class  ColorTest{
    public void test(){
        String name = Color.red.getColorName();
        System.out.println(name);
    }
}

枚举实现单例模式

默认 public static final来修饰枚举

public class Demo{
    public static void main(String[] args) {
        //通过SINGLETON对象调用method方法;
        EnumSingleton instance = EnumSingleton.INSTANCE.getInstance();
        EnumSingleton instance1 = EnumSingleton.INSTANCE.getInstance();
        System.out.println(instance==instance1);
    }
}
enum  EnumSingleton {
    INSTANCE;
    public EnumSingleton getInstance(){
        return INSTANCE;
    }
}

枚举用途

public interface ResultCode {
    //操作是否成功,true为成功,false操作失败
    boolean success();
    //操作代码
    int code();
    //提示信息
    String message();
}

 

@ToString
public enum CommonCode implements ResultCode{
    SUCCESS(true,10000,"操作成功!"),
    FAIL(false,11111,"操作失败!"),
    UNAUTHENTICATED(false,10001,"此操作需要登陆系统!"),
    UNAUTHORISE(false,10002,"权限不足,无权操作!"),
    SERVER_ERROR(false,99999,"抱歉,系统繁忙,请稍后重试!");
    //private static ImmutableMap<Integer, CommonCode> codes ;
    //操作是否成功
    boolean success;
    //操作代码
    int code;
    //提示信息
    String message;
    
    private CommonCode(boolean success,int code, String message){
        this.success = success;
        this.code = code;
        this.message = message;
    }

    @Override
    public boolean success() {
        return success;
    }
    @Override
    public int code() {
        return code;
    }

    @Override
    public String message() {
        return message;
    }
}

获取所有的枚举对象

enum HandlerBeanEnum {
	//给Name赋值
    AHandler("a"),
    BHandler("b"),
    CHandler("c");
    private String Name;
	public String getName() {
		return Name;
	}
	public void setName(String name) {
		Name = name;
	}
	private HandlerBeanEnum(String beanName) {
		this.Name = beanName;
	}
	private HandlerBeanEnum() {
	}
	
}
public class demo {
	@Test
	public void a(){
		//获取所有的枚举对象
		HandlerBeanEnum[] values = HandlerBeanEnum.values();
        for (HandlerBeanEnum value : values) {
            String aString = value.getName();
            System.out.print(aString);
        }
	}
}

  

 

枚举优点?

可以避免反射攻击

参考:https://www.cnblogs.com/chiclee/p/9097772.html

  

 

posted @ 2019-04-24 10:54  小名的同学  阅读(174)  评论(0编辑  收藏  举报