我曾经定义一组相关的常量,例如Bundle
在如下界面中组合键:
public interface From{
String LOGIN_SCREEN = "LoginSCreen";
String NOTIFICATION = "Notification";
String WIDGET = "widget";
}
这为我提供了一种更好的方法将相关常量组合在一起并通过静态导入(而不是实现)来使用它们。我知道Android
框架也以同样的方式使用常量Toast.LENTH_LONG
, View.GONE
.
然而,我常常觉得,Java Enums
提供更好、更强大的方式来表示常数。
但是使用起来有性能问题吗enums
on Android
?
经过一些研究,我最终陷入了困惑。从这个问题“在只需要整数的地方避免枚举”从 Android 性能提示中删除了? https://stackoverflow.com/questions/5143256/why-was-avoid-enums-where-you-only-need-ints-removed-from-androids-performanc很明显Google
已删除“避免枚举”来自其性能提示,但来自其官方培训文档注意内存开销 http://developer.android.com/training/articles/memory.html#Overhead部分明确指出:“枚举通常需要比静态常量多两倍的内存。您应该严格避免在 Android 上使用枚举。”这仍然有效吗? (说在Java
1.6以后的版本)
我观察到的另一个问题是发送enums
across intents
using Bundle
我应该通过序列化发送它们(即putSerializable()
,我认为与原始操作相比,这是一个昂贵的操作putString()
方法,尽管enums
免费提供)。
有人可以澄清哪一种是代表相同内容的最佳方式吗?Android
?我应该严格避免使用enums
on Android
?
Use enum
当您需要它的功能时。不要回避它strictly.
Java枚举更强大,但是如果你不需要它的功能,可以使用常量,它们占用更少的空间,并且它们本身可以是原始的。
何时使用枚举:
- 类型检查 - 你可以接受only列出的值,并且它们不是连续的(见下面我所说的连续的 here)
-
方法重载 - 每个枚举常量都有自己的方法实现
public enum UnitConverter{
METERS{
@Override
public double toMiles(final double meters){
return meters * 0.00062137D;
}
@Override
public double toMeters(final double meters){
return meters;
}
},
MILES{
@Override
public double toMiles(final double miles){
return miles;
}
@Override
public double toMeters(final double miles){
return miles / 0.00062137D;
}
};
public abstract double toMiles(double unit);
public abstract double toMeters(double unit);
}
更多数据 - 您的一个常量包含多个无法放入一个变量中的信息
- 复杂的数据 - 您不断需要方法来操作数据
When not使用枚举:
枚举占用更多空间
- 对枚举常量的单个引用占用4 bytes
- 每个枚举常量占用的空间是其字段大小的总和对齐到8字节+物体的顶部
- 枚举类本身占用一些空间
常量占用更少的空间
- 常量没有引用,因此它是纯数据(即使它是引用,那么枚举实例也将是对另一个引用的引用)
- 常量可以添加到现有的类中 - 无需添加另一个类
- 常量可以内联;它带来了扩展的编译时功能(例如空检查、查找死代码等)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)