Android中关于enum的随笔

导语

在这篇文章中,介绍了Android中enum占用内存的情况。总结一下:enum相比int等,还真的挺占用内存的,好在Google对此已经给出了好办法,可以使用@IntDef@StringDef来完成类似enum的功能。

用法

用法实际上也非常简单,这里举个例子:

//相当于enum
//相当于enum
public class WeekDay {
    //3.参数为1中的集合
    @IntDef({Monday,Tuesday,Wedsday,Tursday,Friday,Santarday,Sunday})
    //4.注解仅存在与源码中,不加入到class文件中
    @Retention(RetentionPolicy.SOURCE)
    //2.声明注解为Weekday
    public @interface Weekday{}

    //1.一些必要的int常量
    public static final int Monday = 1;
    public static final int Tuesday = 2;
    public static final int Wedsday = 3;
    public static final int Tursday = 4;
    public static final int Friday = 5;
    public static final int Santarday = 6;
    public static final int Sunday = 7;
}
public class Holiday {
    //传递的参数是--伪enum
    public void setHoliday(@WeekDay.Weekday int weekDay){
        Log.d("ddd",weekDay+"");
    }
}

调用:

Holiday holiday = new Holiday();
holiday.setHoliday(WeekDay.Friday);

StringDef与IntDef的用法一致,不再重复

联想

如果看了开头文章,可能感觉这样做并不会节省多少内存。但是,如果熟悉Android源码,就会发现一些丧心病狂的节省内存的方法。我参照Google工程师的做法,写了一个小栗子:
Android中关于enum的随笔_第1张图片
需求:用尽可能省内存的方法来保存一个人身高、体重、年龄。(180cm,75kg,30岁)
JavaBean中的代码:

public class Person {
    /**
     * 用来标记身高,体重,年龄
     */
    private int info = 0x00000000;

    /**
     * 设置身高
     * @param height
     */
    public void setHeight(int height){
        info = info & 0xffffff00;
        info += height;
        System.out.printf("设置身高后的个人信息为-->%08x\n",info);//按10位十六进制输出,向右靠齐,左边用0补齐
    }

    /**
     * 设置年龄
     * @param age
     */
    public void setAge(int age){
        info = info & 0xfff000ff;
        age = age << 8;
        info += age;
        System.out.printf("设置身年龄后的个人信息为-->%08x\n",info);
    }

    /**
     * 设置体重
     * @param weight
     */
    public void setWeight(int weight){
        info = info & 0x000fffff;
        weight = weight << 20;
        info += weight;
        System.out.printf("设置身体重后的个人信息为-->%08x\n",info);
    }

    /**
     * 获取身高
     * @return
     */
    public int getHeight(){
        int height = info & 0x000000ff;
        System.out.println("身高为-->"+height);
        return height;
    }

    /**
     * 获取年龄
     * @return
     */
    public int getAge(){
        int age = (info & 0x000fff00) >> 8;
        System.out.println("年龄为-->"+age);
        return age;
    }

    /**
     * 获取体重
     * @return
     */
    public int getWeight(){
        int weight = (info & 0xfff00000) >> 20;
        System.out.println("体重为-->"+weight);
        return weight;
    }
}

运行中的代码:

public class Main {

    public static void main(String[] args) {
        Person person = new Person();
        person.setHeight(180);
        person.setAge(30);
        person.setWeight(75);
        // 这个人可能是个死胖子
        person.setWeight(300);

        person.getAge();
        person.getWeight();
        person.getHeight();

        // 设置一个篮球运动员的个人信息
        person.setHeight(198);
        person.setAge(29);
        person.setWeight(120);

        person.getAge();
        person.getWeight();
        person.getHeight();
    }

}

运行结果:

设置身高后的个人信息为-->000000b4
设置身年龄后的个人信息为-->00001eb4
设置身体重后的个人信息为-->04b01eb4
设置身体重后的个人信息为-->12c01eb4
年龄为-->30
体重为-->300
身高为-->180
设置身高后的个人信息为-->12c01ec6
设置身年龄后的个人信息为-->12c01dc6
设置身体重后的个人信息为-->07801dc6
年龄为-->29
体重为-->120
身高为-->198

上述的代码,用一个int储存了身高,体重和年龄3个信息

理解:
int类型共32位(0x00000000),用最低8位(0x000000 ff)表示身高,再往前的12位(0x000 fff 00)表示年龄,再往前的12位表示体重(0x fff 00000)

分析 07801dc6
从上面的代码执行结果来看,该信息为:
年龄为–>29
体重为–>120
身高为–>198
Android中关于enum的随笔_第2张图片
Android中关于enum的随笔_第3张图片

结语

使用@IntDef@StringDef来完成类似enum的功能,这样可以节省一些内存
另外,我举得的例子的关注点是模仿Google工程师用一个int来保存多条数据

转载请标明出处:http://blog.csdn.net/qq_26411333/article/details/53488272

你可能感兴趣的:(源码理解,随笔)