• Android之使用枚举利弊及替代方案


    Android上不应该使用枚举,占内存,应该使用@XXXDef注解来替代

    使用 Enum 的缺点

    每一个枚举值都是一个对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 String 会占用更多的内存。

    较多的使用 Enum 会增加 DEX 文件的大小,会造成运行时更多的开销,使我们的应用需要更多的空间。

    如果你的应用使用很多的 Enum ,最好使用Integer 或 String 替代他们,但是这样还会有问题。

    既然都说到这个份上了,那么有什么比较好的解决方法呢?

     1 public class SexTest{
     2 
     3     public static enum Sex {
     4         MAN, WOMEN
     5     }
     6 
     7     private Sex sex;
     8     //设置性别
     9     public void setSex(Sex sex){
    10         this.sex = sex;
    11     }
    12 
    13     //获取性别
    14     public String getSex(){
    15         if(Sex.MAN == sex) return "";
    16         if(Sex.WOMEN == sex) return "";
    17         return "未知";
    18     }
    19 
    20     public static void main(String[] args){
    21         //这里的入参必须为Sex枚举类中的其中一个枚举常量
    22         //绝对不允许输入没有再Sex枚举里面定义的常量
    23         setSex(Sex.MAN);
    24         String resultSex = getSex();
    25         System.out.println("resultSex: " + resultSex);
    26         //输出:resultSex: 男
    27     }
    28 }

    解决方案

    既然是因为参数的类型太泛了造成的类型不安全,那么我只要将参数限定在某一个类型集合里面,不就大功告成了?!

    是滴,一下就是要将的@IntDef/@StringDef + @interface来进行限定参数。

    首先你要在build.gradle文件中添加依赖

    dependencies { compile ‘com.android.support:support-annotations:24.2.0’ }

    然后再使用,代码如下:

    public class MainActivity extends Activity {
    public static final int MALE = 0;
    public static final int FEMALE = 1;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        Person person = new Person();
        person.setSex(MALE);
        ((Button) findViewById(R.id.test)).setText(person.getSexDes());
    }
    class Person {
        @SEX
        private int sex;
        public void setSex(@SEX int sex) {
            this.sex = sex;
        }
        @SEX
        public int getSex() {
            return sex;
        }
        public String getSexDes() {
            if (sex == MALE) {
                return "";
            } else {
                return "";
            }
        }
    }
    
    @IntDef({MALE, FEMALE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SEX {
    }
    }

    如果我们尝试在调用setSex()方法的时候,传入不在限定之内的值,那么编译就不会通过,有错误提示。同理,我们也可以使用@StringDef。

    这里我们可以看到,@SEX注解可以放到属性定义,参数,返回值等地方对数据类型进行限制。如果我们直接赋值一个Int参数给setSex(),IDE会直接报错:

     
     
  • 相关阅读:
    Iscroll滑动无效
    原生js 无缝滚动组件
    原生 js dialog弹窗组件
    html5 历史管理
    html5拖拽属性
    highcharts 数据图设置X轴间隔显示效果
    highcharts柱状图含有正负柱设置不同颜色的方法
    移动端滑动插件 swiper
    千分位添加和去掉方法
    dubbo常用类和路径
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/8447033.html
Copyright © 2020-2023  润新知