您的位置:首页 > 移动开发 > Android开发

Android中关于enum的随笔

2016-12-06 17:41 309 查看

导语

这篇文章中,介绍了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工程师的做法,写了一个小栗子:



需求:用尽可能省内存的方法来保存一个人身高、体重、年龄。(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





结语

使用@IntDef@StringDef来完成类似enum的功能,这样可以节省一些内存

另外,我举得的例子的关注点是模仿Google工程师用一个int来保存多条数据

转载请标明出处:http://blog.csdn.net/qq_26411333/article/details/53488272
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android IntDef StringDef