关于java枚举和Android使用枚举的一些小姿势

laisun 8年前
   <h2>枚举是什么?</h2>    <p>直接上代码:</p>    <p>首先我们创建一个枚举类型的文件,命名为ColorEnum。</p>    <pre>  <code class="language-java">public enum ColorEnum{      RED,      GREEN,      YELLOW  }</code></pre>    <p>然后创建一个Pen类,假设Pen类有个属性为Color,见下面</p>    <pre>  <code class="language-java">class Pen {      private ColorEnum color;      //其它属性忽略        void setColor(ColorEnum color) {          this.color = color;      }        ColorEnum getColor() {          return color;      }  }</code></pre>    <p>在主类中为Pen的对象赋值并获取Color属性:</p>    <pre>  <code class="language-java">public class Main {          public static void main(String args[]) {          Pen pen = new Pen();          pen.setColor(ColorEnum.RED);          System.out.println(pen.getColor());      }  }</code></pre>    <p>这就是java1.5之后引入的的枚举的一种应用。它主要用于取代使用常量枚举的方式,即下面所示方式:</p>    <pre>  <code class="language-java">public class Main {        public static final int COLOR_RED = 0;      public static final int COLOR_GREEN =1;      public static final int COLOR_BLUE = 2;      public static void main(String args[]) {          Pen pen = new Pen();          pen.setColor(COLOR_RED);          System.out.println(pen.getColor());      }  }</code></pre>    <p>使用枚举类型可以提高代码的安全性(防止输入枚举之外的值)和可读性(在打印日志时)。另外注意两个点:上述的ColorEnum实质上会在编译时转换成继承java.lang.enum的类,所以ColorEnum <strong>不可继承自其它的类</strong> 。此外,被编译后的ColorEnum会被标记为final,即不可 <strong>被继承</strong> 。</p>    <p>在枚举类型中有一个方法values(),用于以数组方式将枚举类型中的所有选项获取出来。</p>    <h2>在switch中的应用</h2>    <p>仍然以上面的例子讲述。枚举配合switch使用可以使得我们的代码规范性和美观性增加不少。具体见下:</p>    <pre>  <code class="language-java">public class Main {      public static void main(String args[]) {          Pen pen = new Pen();          pen.setColor(ColorEnum.RED);          switch(pen.getColor()){              case GREEN:                  System.out.println("GREEN");                  break;              case RED:                  System.out.println("RED");                  break;              case YELLOW:                  System.out.println("YELLOW");                  break;          }        }  }</code></pre>    <h2>Android中性能与枚举类型的冲突</h2>    <p>看到这么优秀的工具有些人迫不及待地想要在自己的Android代码中使用它了。先别急着使用,由于android的性能问题,java枚举类型在Android并不是那么适用了!先看看官方给出的答案:</p>    <p>Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.</p>    <p>上面的意思是:枚举类型需要两倍于静态常量的内存,不要在android中使用枚举类型!在使用枚举后会使编译后的dex增大许多,另外还会占据额外的运行内存,所以传统的枚举类型不可在android中使用。</p>    <h2>Android中使用枚举的姿势</h2>    <p>但是由于枚举的优秀性,我们还是有在Android中使用枚举的价值的。为了解决这个问题,Android官方引入了两个注解,分别是StringDef和IntDef。具体方法见下:</p>    <p>首先引入依赖:</p>    <p>compile 'com.android.support:support-annotations:22.0.0'</p>    <p>使用注解声明枚举类型(关于注解部分知识可以参照楼主之前的博客):</p>    <pre>  <code class="language-java">@IntDef({RED, GREEN, YELLOW})  @Retention(RetentionPolicy.SOURCE)  public @interface ColorEnum {  }</code></pre>    <p>然后再次声明Pen类:</p>    <pre>  <code class="language-java">class Pen{      @ColorEnum      private int color;        @ColorEnum      public int getColor(){          return color;      }        public void setColor(@ColorEnum int color){          this.color = color;      }  }</code></pre>    <p>在主方法调用:</p>    <pre>  <code class="language-java">public static final int MALE = 0;  public static final int FEMALE = 1;  Pen pen = new Pen();  pen.setColor(MALE);</code></pre>    <p>当你为pen的color属性随便给一个int值时,IDE会报错。但仅限于IDE报错,程序仍然可以运行。比如:</p>    <pre>  <code class="language-java">pen.setColor(2);</code></pre>    <p>上述代码会有红色下划线并且警告,但是程序可以编译运行,这是由于RetentionPolicy.SOURCE使得注解是在源码阶段生效的,从而只有IDE代码检查工具会去判断是否正确。</p>    <h2>总结</h2>    <p>在java中使用枚举是一种有价值的规范代码的方式,但是在安卓中就得根据时机选择是否使用了。一般情况下如果只是简单的几个枚举量使用注解来进行枚举的必要性并不大。切记不要直接在Android中使用枚举类型!</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/118afe1cf628</p>    <p> </p>