你不知道的枚举

1,152 阅读3分钟

聊一聊枚举

经常可以看到枚举这个哥么,但是对他了解的非常少,本着好奇的心情,系统的研究一下,解决自己心中的困惑。

关于枚举引发的思考

有个哥么(大神)给我提了一个建议:个人建议从what-how-why的角度去完善下。

另外,开发过程中使用enum的优缺点、android是否建议使用enum、enum限定参数等都可以讲一下。

为什么要使用枚举

优点

1、方法的参数使用枚举,这样可以限定参数的使用范围和值。

缺点

1、相比于静态变量,会占用更多的内存并且会产生更大的文件。

android建议是否使用枚举

android不建议使用枚举,详细的介绍请看下面的文章(绝对冲击你的思想)

www.cnblogs.com/zgz345/p/58…

枚举是什么

指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。
举例:一周只有7天,一年只有12个月等。

枚举的实现方式一:class 实现的枚举

1、自定义枚举类型(关键字:静态常量 + 私有构造)

package com.example.test;

/**
 * 自定义枚举
 */
public class Week {

    //静态的常量
    public static final Week MON = new Week();
    public static final Week TUE = new Week();
    public static final Week WED = new Week();

    //私有构造
    private Week(){

    }
}

使用方法如下

Week flag = Week.MON;
if (flag == Week.MON) {
    Toast.makeText(this, "星期一", Toast.LENGTH_SHORT).show();
}

2、自定义有参数枚举(关键字:静态常量 + 私有构造 + 参数)

package com.example.test;

/**
 * 自定义枚举
 */
public class Week {

    private final String name;

    //静态的常量
    public static final Week MON = new Week("星期一");
    public static final Week TUE = new Week("星期一");
    public static final Week WED = new Week("星期一");

    //私有构造 + 参数
    private Week(String name){
        this.name = name;
    }

    public String getName(){
        return  name;
    }
}

使用方式如下:

        Week flag = Week.MON;
        if (flag == Week.MON) {
            Toast.makeText(this, flag.getName(), Toast.LENGTH_SHORT).show();
        }

3、抽象类实现枚举类型(关键字:抽象方法+ 静态常量 + 私有构造)

package com.example.test;

import android.util.Log;

/**
 * 定义枚举类型
 */
public abstract class Week {

    private static final String TAG = Week.class.getSimpleName();
    private final String name;

    //静态的常量
    public static final Week MON = new Week("星期一"){

        @Override
        public void show() {
            Log.e(TAG,"星期一");
        }
    };
    public static final Week TUE = new Week("星期二") {
        @Override
        public void show() {
            Log.e(TAG,"星期二");
        }
    };
    public static final Week WED = new Week("星期三") {
        @Override
        public void show() {
            Log.e(TAG,"星期三");
        }
    };

    //私有构造 + 参数
    private Week(String name){
        this.name = name;
    }

    public String getName(){
        return  name;
    }

    public abstract void show();
}

使用方式如下:

        Week flag = Week.MON;
        if (flag == Week.MON) {
            Toast.makeText(this, flag.getName(), Toast.LENGTH_SHORT).show();
        }

枚举的实现方式二:enum实现的枚举

1、利用enum实现枚举类

package com.example.test;

/**
 * 利用enum实现枚举
 */
public enum  Week {
    MON,TUE,WED;
}

使用方式如下:

        Week flag = Week.MON;
        if (flag == Week.MON) {
            Toast.makeText(this, "星期一", Toast.LENGTH_SHORT).show();
        }

2、利用enum + 构造实现枚举

package com.example.test;

/**
 * 利用enum + 构造实现枚举
 */
public enum  Week {

    MON("星期一"),TUE("星期二"),WED("星期三");

    private final String name;

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

    public String getName(){
        return name;
    }

}

调用方法如下:

        Week flag = Week.MON;
        if (flag == Week.MON) {
            Toast.makeText(this, flag.getName(), Toast.LENGTH_SHORT).show();
        }

3、利用enum + 私有构造 + 抽象方法实现枚举

package com.example.test;

import android.util.Log;

/**
 * 利用enum + 构造实现枚举
 */
public enum Week {

    MON("星期一"){
        @Override
        public void show() {
            Log.e(TAG,"星期一");
        }
    },
    TUE("星期二"){
        @Override
        public void show() {

        }
    },
    WED("星期三"){
        @Override
        public void show() {

        }
    };

    private static final String TAG = Week.class.getSimpleName();

    private final String name;

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

    public String getName(){
        return name;
    }

    public abstract void show();

}

4、枚举实现接口

package com.example.test;

import android.util.Log;

/**
 * 利用enum + 构造实现枚举
 */
public enum Week implements Test{

    MON("星期一"){
        @Override
        public void test() {

        }

        @Override
        public void show() {
            Log.e(TAG,"星期一");
        }
    },
    TUE("星期二"){
        @Override
        public void test() {

        }

        @Override
        public void show() {

        }
    },
    WED("星期三"){
        @Override
        public void test() {

        }

        @Override
        public void show() {

        }
    };

    private static final String TAG = Week.class.getSimpleName();

    private final String name;

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

    public String getName(){
        return name;
    }

    public abstract void show();

}

interface Test {
    void test();
}