Java提供了枚举(enum)类型来方便我们定义一些常量,这很方便组织我们的代码。但是殊不知枚举比静态常量占用了两倍多的内存。所在在我们Android开发中,不要再使用枚举而是使用静态常量或注解@IntDef来取代。当然在代码中使用了枚举也可以不修改代码,但是需要在发布app时使用ProGuard会将枚举转换为静态常量。

enusm是如何影响到我们的app的

我们知道代码最终会编译成DEX文件,并且在运行时加载到内存中。系统为我们的app分配了一定的内存。这个内存大小可以在adb中执行adb shell getprop | grep heap来查看。DEX文件会占用系统为我们分配的内存。如果DEX文件过大的话,可用内存就会变小。

例如我们现在有一个app它的DEX文件编译后为2566bytes。我们添加一些静态常量代码:

public static final int VALUE1 = 1;
public static final int VALUE2 = 2;
public static final int VALUE3 = 3;

int func(int value){
	switch(value){
	    case VALUE1:
	        return -1;
	    case VALUE2:
	        return -2;
	    case VALUE3:
	        return -3;
	}
	return 0;
}

最终编译生成的DEX大小为2680bytes

相比我们来看下enum:

public static enum Value{
	VALUE1,
	VALUE2,
	VALUE3
}

int func(Value value){
	switch(value){
	    case VALUE1:
	        return -1;
	    case VALUE2:
	        return -2;
	    case VALUE3:
	        return -3;
	}
	return 0;
}

最终生成的DEX大小达到4188bytes,我们看到加了一个enum就让DEX占用了如此大的内存。如果你在app中很多地方用到了enum,真是太可怕了。

定义一个enum,enum中的每一项都会额外占用20+bytes,另外系统会为enum数组额外分配12-16bytes


IMAKIBA

Welcom to my blog!