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学习随笔六)
- 随笔:关于权限android.permission.SYSTEM_ALERT_WINDOW
- 关于横竖屏切换问题几点知识(Android学习随笔一)
- [Android随笔]Android关于Crash的处理
- 关于TelephonyManager的使用与手机电池电量小知识(Android学习随笔五)
- 关于用Nunit获取不到Web.Config配置的问题(随笔)
- 关于Android这个名字。。。
- [工作随笔]关于马戏团的故事
- [工作随笔]关于马戏团的故事
- [工作随笔]关于马戏团的故事
- 代码生成工具随笔(1) ---关于代码生成器
- [工作随笔]关于马戏团的故事
- 关于enum应用的总结
- [工作随笔]关于马戏团的故事
- [工作随笔]关于马戏团的故事
- 关于分层开发的随笔
- GIS开发随笔(2)——关于建立GIS数据库的几个问题
- [工作随笔]关于马戏团的故事
- 关于IT团队管理的随笔
- 自制的日历控件,可以在日历上DIY事情,相关于记一些随笔的文字之类的话题,如“1/28 是新年啊”