简介

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

Android中Enum(枚举)的使用的更多相关文章

  1. 在Android中使用枚举注解而不是枚举

    Enums often require more than twice as much memory as static constants. You should strictly avoid us ...

  2. 项目中Enum枚举的使用

    在.NET中,枚举一般有两种常见用法,一是表示唯一的元素序列,比如表示订单状态(未提交,待处理,处理中...).另外一种是表示多种组合的状态,比如表示权限,因为可同时有多个不同权限. 基本用法 这里拿 ...

  3. Java中Enum枚举的使用

    三种不同的用法 注意项: 1.在switch中使用枚举能使代码的可读性更强.   2.如果要自定义方法,那么必须在enum实例序列的最后添加分号.而且Java要求必须先定义enum实例.   3.所有 ...

  4. java 中 enum 枚举的使用

    package test3; public final class Program {    public static void main(String[] args) {       // Sys ...

  5. Android 中如何使用 enum / 枚举

    如何在Android开发中合理的使用enum 欢迎大家访问我的Github开源库,这里有好玩的App源码,想和大家分享.https://github.com/ChoicesWang 转载请注明:htt ...

  6. Android中是否推荐使用枚举Enum

    一.Enum的产生 Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等.其中Enum就是我们在C或C++中见过的枚举类型,但是Java中的枚举又比C或C++中的枚举更成熟 ...

  7. MVC3不能正确识别JSON中的Enum枚举值

    一.背景 在MVC3项目里,如果Action的参数中有Enum枚举作为对象属性的话,使用POST方法提交过来的JSON数据中的枚举值却无法正确被识别对应的枚举值. 二.Demo演示 为了说明问题,我使 ...

  8. .NET中的枚举(Enum)

    摘要:.NET中的枚举分为简单枚举和标志枚举,这次主要总结一下标志枚举适用条件,以及它的使用方法,并在文章的最后列举枚举使用的一些规范. 在刚接触.NET的枚举时,只用简单的枚举,对于标记枚举,只知道 ...

  9. Android笔记:java 中的枚举

    部分数据使用枚举比较方便,java中的enmu不如c#中使用方便 记录备忘 以c#中的代码为例 public enum PlayState { /// <summary> /// 关闭 / ...

随机推荐

  1. Vmware unknow Interface ens33

    vmare打开虚拟网络编辑器,按图示操作

  2. Pandas plot出图

    1.创建一个Series 这是一个线性的数据,我们随机生成1000个数据,Series 默认的 index 就是从0开始的整数,但是这里我显式赋值以便让大家看的更清楚 >>> imp ...

  3. 消息模式Toast.makeText的几种常见用法

    Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于 一些帮助 / 提示. Toast 最 ...

  4. xbeePRO900HP的几个关键参数

    xbee PRO 900HP又叫xbee PRO S3B,在模块的正面有S3B的字样: 因为用到这个模块的,多用的是digimesh组网固件,所以以下参数修改只针对digimesh的修改:市面上的xb ...

  5. /bin/bash: /bin/java: Is a directory 解决

    Hadoop执行 mapreduce报错 -- ::, INFO mapreduce.Job: map % reduce % -- ::, INFO mapreduce.Job: Job job_15 ...

  6. 2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)

    传送门 题意:支持单点修改,维护子树里的最大连通子块和. 思路: 扯皮: bzojbzojbzoj卡常差评. 网上的题解大多用了跟什么最大子段和一样的转移方法. 但是我们实际上是可以用矩阵转移的传统d ...

  7. 位图法bitmap

    1.概念 1)所谓bitmap,就是用每一位(bit)来标记某个元素对应的value, 而key即是该元素,通常bitmap是一个int数组,用每一个int数的每一个bit来映射某个数据 2)由于采用 ...

  8. python基本数据类型之字符串(二)

    python基本数据类型之字符串(二) 替换方法 python中字符串的替换方法主要有:center.rjust\ljust.expandtabs.format\format_map(格式化).str ...

  9. java框架学习_mybaties

    Mybatis第一天   框架课程 1. 课程计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybati ...

  10. Oracle实现like多个值的查询

    问题背景描述: 某天客户有一个需求,给定一批的手机号码或者电话号码,查询出相关的通话记录,以及相关的一些信息. 客户给定的被叫号码如图所示:   查询出来的结果如下图所示(本批次的结果不是上图导入的结 ...