【达内课程】Enum(枚举)的使用

news/2024/5/19 0:48:00 标签: Enum, 枚举

文章目录

  • 常规用法
    • 遍历枚举
    • 作为switch的判断条件
  • 给 enum 自定义属性和方法
  • 替代方案

常规用法

在Java中,被 enum (enumeration)关键字修饰的类型就是枚举类型,是一组固定选项,代替整数代码常量选项,提供类型安全的选项,例如:

public enum TypeEnum {
    TYPE_IMAGE,
    TYPE_VIDEO,
}

如果枚举不添加任何方法,枚举值默认为从0开始的有序数值。以 TypeEnum 枚举类型举例,它的枚举常量依次为

TYPE_IMAGE:0,TYPE_VIDEO:1

每个选项,本质是 TypeEnum 类型的实例,所以刚才的枚举的代码等价于调用了两次Enum(String name, int ordinal)),即


new Enum<TypeEnum>("TYPE_IMAGE", 0);
new Enum<TypeEnum>("TYPE_VIDEO", 1);

遍历枚举

for(TypeEnum t:TypeEnum.values()){
	Log.d("TypeEnum",""+t+":"+t.ordinal()+","+t.name());
}

查看运行结果
在这里插入图片描述

作为switch的判断条件

使用枚举作为 switch 语句判断条件能让我们的代码可读性更强:

TypeEnum type = TypeEnum.TYPE_IMAGE;
        switch (type) {
            case TYPE_IMAGE:
                Log.d("TypeEnum", "图片类型");
                break;
            case TYPE_VIDEO:
                Log.d("TypeEnum", "视频类型");
                break;
            default:
                Log.d("TypeEnum", "类型错误");
                break;
        }

运行结果
在这里插入图片描述

给 enum 自定义属性和方法

枚举类型的构造函数是私有的 private,所以不能通过 New 来创建枚举类型,正因如此才保证了枚举数据类型的安全,不会被更改

public enum Color {
    RED("red",1),
    YELLOW("yellow",2),
    BLUE("blue",3);

    private String name;
    private int index;

    Color(String name,int index){
        this.name = name;
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public int getIndex() {
        return index;
    }
}
		Color color = Color.RED;
        switch (color) {
            case RED:
                Log.d("Color", "红色象征热情"+color.getIndex());
                break;
            case YELLOW:
                Log.d("Color", "黄色象征活力"+color.getIndex());
                break;
            case BLUE:
                Log.d("Color", "蓝色象征深沉"+color.getIndex());
                break;
            default:
                Log.d("Color", "不存在的颜色");
                break;
        }

在这里插入图片描述

再举个栗子

public enum LanguageEnum {
    LANGUAGE("language"),
    LANGUAGE_zh("zh"),
    LANGUAGE_en("en");

    private String language;//自定义属性

    /**构造函数,枚举类型只能为私有*/
    LanguageEnum(String language) {
        this.language = language;
    }

    public String getLanguage(){
        return language;
    }
}
Log.d("TTT","语言类型为"+LanguageEnum.LANGUAGE_zh.getLanguage());

日志输出

语言类型为zh

替代方案

大佬们说枚举很占用内存

其实 Android 为我们提供了枚举的替代方案 —— 注解方式(@IntDef、@StringDef、@LongDef),其性能远远高于枚举,下面我们就来说说如何使用

首先添加依赖

implementation 'com.android.support:support-annotations:28.0.0'
public class MainActivity extends AppCompatActivity {

    //先定义 常量
    public static final int SUNDAY = 0;
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    public static final int WEDNESDAY = 3;
    public static final int THURSDAY = 4;
    public static final int FRIDAY = 5;
    public static final int SATURDAY = 6;

    //用 @IntDef "包住" 常量;
    // @Retention 定义策略
    // 声明构造器
    @IntDef({SUNDAY, MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY})
    @Retention(RetentionPolicy.SOURCE)
    public @interface WeekDays {}

    @WeekDays int currentDay = SUNDAY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setCurrentDay(WEDNESDAY);

        //声明变量
        @WeekDays int today = getCurrentDay();

        switch (today){
            case SUNDAY:
                Log.d("TTT","SUNDAY");
                break;
            case MONDAY:
                Log.d("TTT","MONDAY");
                break;
            case TUESDAY:
                Log.d("TTT","TUESDAY");
                break;
            case WEDNESDAY:
                Log.d("TTT","WEDNESDAY");
                break;
            case THURSDAY:
                Log.d("TTT","THURSDAY");
                break;
            case FRIDAY:
                Log.d("TTT","FRIDAY");
                break;
            case SATURDAY:
                Log.d("TTT","SATURDAY");
                break;
            default:
                break;
        }

    }

    public void setCurrentDay(@WeekDays int currentDay) {
        this.currentDay = currentDay;
    }

    @WeekDays
    public int getCurrentDay() {
        return currentDay;
    }
}

我们可以换种写法,差不多,只不过是在初始化注解类的时候给成员赋值

public class SecondActivity extends AppCompatActivity {

    //注解类的成员默认就是 public static final 修饰的
    @IntDef({WeekDays.SUNDAY, WeekDays.MONDAY, WeekDays.TUESDAY, WeekDays.WEDNESDAY, WeekDays.THURSDAY, WeekDays.FRIDAY, WeekDays.SATURDAY})
    @Retention(RetentionPolicy.SOURCE)
    public @interface WeekDays {
        int SUNDAY = 0;
        int MONDAY = 1;
        int TUESDAY = 2;
        int WEDNESDAY = 3;
        int THURSDAY = 4;
        int FRIDAY = 5;
        int SATURDAY = 6;
    }

    @WeekDays
    int currentDay = WeekDays.SUNDAY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        setCurrentDay(WeekDays.WEDNESDAY);
        int today = getCurrentDay();

        switch (today) {
            case WeekDays.SUNDAY:
                Log.d("TTT", "SUNDAY");
                break;
            case WeekDays.MONDAY:
                Log.d("TTT", "MONDAY");
                break;
            case WeekDays.TUESDAY:
                Log.d("TTT", "TUESDAY");
                break;
            case WeekDays.WEDNESDAY:
                Log.d("TTT", "WEDNESDAY");
                break;
            case WeekDays.THURSDAY:
                Log.d("TTT", "THURSDAY");
                break;
            case WeekDays.FRIDAY:
                Log.d("TTT", "FRIDAY");
                break;
            case WeekDays.SATURDAY:
                Log.d("TTT", "SATURDAY");
                break;
        }
    }

    public void setCurrentDay(@WeekDays int currentDay) {
        this.currentDay = currentDay;
    }

    @WeekDays
    public int getCurrentDay() {
        return currentDay;
    }
}

@IntDef用于简化从枚举到整型值的转换,实现 String 类型的效果时需用@StringDef,还有 @LongDef

Java枚举:小小enum,优雅而干净


http://www.niftyadmin.cn/n/1817195.html

相关文章

剑指offer 12. 矩阵中的路径

剑指 Offer 12. 矩阵中的路径 - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com) 目录 非递归写法&#xff08;含注释&#xff09; 运行结果 递归写法 运行结果 非递归写法&#xff08;含注释&#xff09; class Solution {enum class direction { N, U, D, L,…

程序员的惯例

为什么Java程序员喜欢命名变量“clazz” 这只是因为’class’是一个保留关键字&#xff0c;因此不允许使用Class class。但缩写或插入(“a”&#xff0c;“the”&#xff0c;"_"等)会降低清晰度。因此&#xff0c;你将看到Class clazz或Class cls

剑指offer 07. 重建二叉树

剑指 Offer 07. 重建二叉树 - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com) 题目不难&#xff0c;理解了二叉树的先序遍历和中序遍历之后就能很容易地写出代码。 目录 运行结果 代码 运行结果 代码 class Solution { public:TreeNode* buildTree(vector<in…

【Kotlin】委托和代理、单例

文章目录委托和代理单例委托和代理 我们创建一个IWashBowl接口&#xff0c;里边有一个洗碗的方法 interface IWashBowl {fun washing() }现在有大头儿子和小头爸爸&#xff0c;大头儿子洗碗赚1块钱&#xff0c;小头爸爸赚10块钱 class BigHeadSon:IWashBowl {override fun wa…

【Kotlin】枚举和印章类

印章类 印章类又称为密封类&#xff0c;用来表示受限的类继承结构&#xff1a;当一个值为有限几种的类型, 而不能有任何其他类型时。使用sealed关键字修饰类&#xff0c;印章类可以有子类&#xff0c;但是所有的子类都必须要内嵌在印章类中 现有母驴、公驴、公马三只动物 母驴…

剑指offer 13. 机器人的运动范围

剑指 Offer 13. 机器人的运动范围 - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com) class Solution {int m, n, k;vector<vector<bool>> not_visited; public:int movingCount(int M, int N, int K) {m M; n N; k K;not_visited vector<vector…

神奇的等式(大贤者福尔)

目录 题干 题面描述 输入 输出 示例输入 示例输出 思路 代码&#xff08;含注释&#xff09; 运行结果 题干 题面描述 大贤者福尔在研究数学问题时&#xff0c;发现有一些自然数能够构成一个形如下式的等式&#xff0c;颇为神奇。 (x0 * x1 * x2 * x3 * x4) / (x5 …

乘积(大贤者福尔)

目录 题干 题面描述 输入 输出 示例输入 示例输出 分析 代码 运行结果 题干 题面描述 大贤者福尔的数学研究成绩斐然&#xff0c;影响力越来越大&#xff0c;也有很多人向他请教。最近&#xff0c;有人咨询他一个问题。给定若干个整数S {S1, S2, ..., Sn}&#xff…