Android中Enum(枚举)的使用

少年意气强不羁,虎胁插翼白日飞。这篇文章主要讲述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"; }

【Android中Enum(枚举)的使用】 
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
 

    推荐阅读