【发布时间】:2015-05-24 21:18:38
【问题描述】:
我曾经在如下界面中定义了一组相关的常量,例如Bundle 键:
public interface From{
String LOGIN_SCREEN = "LoginSCreen";
String NOTIFICATION = "Notification";
String WIDGET = "widget";
}
这为我提供了一种更好的方式来将相关常量组合在一起并通过静态导入(而不是实现)来使用它们。我知道Android 框架也以相同的方式使用常量,例如Toast.LENTH_LONG、View.GONE。
但是,我经常觉得Java Enums 提供了更好更强大的方式来表示常量。
但是在Android 上使用enums 是否存在性能问题?
通过一些研究,我最终感到困惑。从这个问题
"Avoid Enums Where You Only Need Ints” removed from Android's performance tips? 很明显,Google 已从其性能提示中删除了 "Avoid enums",但在其官方培训文档 Be aware of memory overhead 部分中明确表示:“枚举通常需要超过内存是静态常量的两倍。您应该严格避免在 Android 上使用枚举。" 这仍然成立吗? (比如Java 1.6 之后的版本)
我观察到的另一个问题是使用Bundle 跨intents 发送enums 我应该通过序列化发送它们(即putSerializable(),我认为与原始putString() 方法相比,这是一个昂贵的操作,尽管enums免费提供)。
有人可以澄清在Android 中哪个是代表相同的最佳方式吗?我应该严格避免在Android 上使用enums 吗?
【问题讨论】:
-
您应该使用现有的工具。事实上,一个活动或片段会占用大量内存和 cpu 使用率,但这不是停止使用它们的理由。如果您只需要它,请使用静态 int,并在需要时使用枚举。
-
我同意。这闻起来像是过早的优化。除非您遇到性能和/或内存问题,并且可以通过分析证明枚举是原因,否则请在有意义的地方使用它们。
-
过去人们认为枚举会导致非平凡的性能损失,但最近的基准测试表明使用常量没有任何好处。见stackoverflow.com/questions/24491160/… 和stackoverflow.com/questions/5143256/…
-
为了避免在 Bundle 中序列化 Enum 的性能损失,您可以使用
Enum.ordinal()将其作为 int 传递。 -
最后这里有一些关于 Enum 性能问题的解释youtube.com/watch?v=Hzs6OBcvNQE