• Android中Enum(枚举)的使用


    简介

    enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

    创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

    Android官网不建议使用enums,占用内存多(Enums often require more than twice as much memory as static constants.)。

    Android中当你的App启动后系统会给App单独分配一块内存。App的DEX code、Heap以及运行时的内存分配都会在这块内存中。

    用法一:常量

    package com.why.project.androidcnblogsdemo.enumtype;
    
    /**
     * Created by HaiyuKing
     * Used 存储位置类型
     */
    
    public enum TypeEnum {
        CACHE,//缓存存储
        FILE;//文件存储
    }
    package com.why.project.androidcnblogsdemo.activity;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    
    import com.why.project.androidcnblogsdemo.R;
    import com.why.project.androidcnblogsdemo.enumtype.IConstants;
    import com.why.project.androidcnblogsdemo.enumtype.LanguageEnum;
    import com.why.project.androidcnblogsdemo.enumtype.TypeEnum;
    
    /**
     * Created by HaiyuKing
     * Used 枚举类测试
     */
    
    public class EnumActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_enum);
    
            Log.d("EnumActivity","TypeEnum.CACHE=" + TypeEnum.CACHE);//TypeEnum.CACHE=CACHE
    //对于无构造函数的枚举类的一般使用 TypeEnum typeEnum =
    TypeEnum.CACHE; createPath(typeEnum); } private void createPath(TypeEnum createPath){ if(createPath == TypeEnum.CACHE){ Log.d("EnumActivity","创建缓存目录"); }else{ Log.d("EnumActivity","创建文件目录"); } } }

    用法二:给 enum 自定义属性和方法

    package com.why.project.androidcnblogsdemo.enumtype;
    
    /**
     * 语种类型
     */
    public enum LanguageEnum {
        LANGUAGE("language"),//语言,用于SharedPreferences存储的Key值
        LANGUAGE_zh("zh"),//中文,用于SharedPreferences存储的Value值
        LANGUAGE_en("en"), //英语
        LANGUAGE_es("es"),//西语
        LANGUAGE_fr("fr"),//法语
        LANGUAGE_ar("ar"),//阿语
        LANGUAGE_ru("ru");//俄语
    
        private String language;//自定义属性
    
        /**构造函数,枚举类型只能为私有*/
        LanguageEnum(String language) {
            this.language = language;
        }
    
        //自定义方法
        public String getLanguage(){
            return language;
        }
    }
    package com.why.project.androidcnblogsdemo.activity;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    
    import com.why.project.androidcnblogsdemo.R;
    import com.why.project.androidcnblogsdemo.enumtype.IConstants;
    import com.why.project.androidcnblogsdemo.enumtype.LanguageEnum;
    import com.why.project.androidcnblogsdemo.enumtype.TypeEnum;
    
    /**
     * Created by HaiyuKing
     * Used 枚举类测试
     */
    
    public class EnumActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_enum);
    
            Log.d("EnumActivity","LanguageEnum.LANGUAGE_zh.getLanguage()=" + LanguageEnum.LANGUAGE_zh.getLanguage());//LanguageEnum.LANGUAGE_zh.getLanguage()=zh
    
        }
    }

    替代方案

    接口变量

    因为接口会自动将成员变量设置为静态的(static)、不可变的(final),这一点可以防止某些情况下错误地添加新的常量。这也使得代码看起来更简单和清晰。 同时,一个的简单测试显示,同样的接口(字节码文件)占用的空间是209个字节左右,而类(字节码文件)占用的空间是366个字节左右。更少的字节码文件意味着加载和维护的成本更低。此外,JVM 加载接口的时候,不需要担心类提供的额外特征(如重载、方法的动态绑定等),因此加载更快。

    package com.why.project.androidcnblogsdemo.enumtype;
    
    /**
     * Created by HaiyuKing
     * Used
     */
    
    public interface IConstants {
        //接口会自动将成员变量设置为静态的(static)、不可变的(final)
        String LANGUAGE = "language";
        String LANGUAGE_zh = "zh";
        String LANGUAGE_en = "en";
        String LANGUAGE_es = "es";
        String LANGUAGE_fr = "fr";
        String LANGUAGE_ar = "ar";
        String LANGUAGE_ru = "ru";
    }
    package com.why.project.androidcnblogsdemo.activity;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    
    import com.why.project.androidcnblogsdemo.R;
    import com.why.project.androidcnblogsdemo.enumtype.IConstants;
    import com.why.project.androidcnblogsdemo.enumtype.LanguageEnum;
    import com.why.project.androidcnblogsdemo.enumtype.TypeEnum;
    
    /**
     * Created by HaiyuKing
     * Used 枚举类测试
     */
    
    public class EnumActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_enum);
    
            Log.d("EnumActivity","IConstants.LANGUAGE_zh=" + IConstants.LANGUAGE_zh);//IConstants.LANGUAGE_zh=zh
        }
    }

    参考资料

    java enum(枚举)使用详解 + 总结

    Java enum的用法详解

    Android中是否推荐使用枚举Enum

  • 相关阅读:
    docker入门——centos安装
    NET应用——你的数据安全有必要升级
    mysql事件机制——定时任务
    是时候升级你的Js工具了-分页【基于JQ】
    优美库图片系统
    爬虫之蜂鸟网图片爬取
    壁纸提取
    CSDN刷阅读数
    tkinter基础-输入框、文本框
    数据结构与算法之选择排序
  • 原文地址:https://www.cnblogs.com/whycxb/p/7995085.html
Copyright © 2020-2023  润新知