众所周知,Enum在项目中用到的是非常多的。但是Enum的内存问题也是令人头疼的问题,在apk中Enum比常量多5到10倍的内存占用。所以关于内存优化这是个很有嚼头的问题!下边我就来说下常用的@InDef来替换Enum达到和Enum相同的功能,但是内存反而比Enum远远小。
一:何为Enum?Enum的用法?
关于这个问题,网上有很多帖子都说的非常详细,我就在不概述了,大家可以看看这个帖子https://blog.csdn.net/testcs_dn/article/details/78604547。
二:何为@InDef ?Indef的使用。
如果要使用@InDef 一般都会用到注解,所以在了解@InDef的用法之前,还是要先加入注解库,关于注解库的引用,一般都是在AS中加入
dependencies { compile 'com.android.support:support-annotations:xx.x.x' }
版本可以自己选。 然后要来说说@Retention,如果对注解不懂的同学,可以看下https://blog.csdn.net/asdgbc/article/details/70196749,写的还是非常详细的。看完后就可以来使用InDef来替换Enum了。
下边请看下边的代码
public class TestBean { public static final int UP=1; public static final int down=2; public static final int left=3; @Retention(RetentionPolicy.SOURCE) @IntDef({UP,down,left}) private @interface Duration{} public void setValue(@Duration int value){ mValue=value; } private int mValue; public int getValue(){ return mValue; } }
从中就可以发现@Retention用法和@InDef的用法。然后我们来看下用了InDef后的内存情况,
可以看到跑了30s的时候,内存还是27.6。
下边来对比下不使用InDef时的内存情况。
同样是30s的时间。我们可以看到,内存比使用InDef多了有将近2.5M左右,
三:结论
从以上使用InDef和不使用InDef就可以看出使用Indef的时候内存是明显的减少的,说明InDef使用会比Enum的时候,内存减少很多。如果有兴趣的同学还可以去实现@StringDef,用法是和@InDef的用法是一样的。好了,这次的分享就到这了。下次可以试试自定义的注解来替换Enum。