枚举
垃圾收集
在底层,枚举是类的静态成员,因此它们不会被垃圾回收。它们会在您的应用程序的整个生命周期中保留在内存中。这可能是有利的,也可能是不利的。
垃圾收集过程在 CPU 使用方面的开销很大。对象创建也是如此,您不想一次又一次地创建相同的对象。因此,使用枚举,您可以节省垃圾收集和对象创建的成本。这是好处。
缺点是枚举即使不使用也会留在内存中,这样可以一直占用内存。
需要考虑的因素
如果您的应用中有 100 到 200 个枚举,则无需担心所有这些。但是当你有更多的时候,你可以决定是否应该使用枚举,这取决于枚举的数量、它们是否会一直使用以及分配给你的 JVM 的内存量等事实。
比较
when 表达式中的枚举值比较更快,因为它在后台使用 tableswitch 来比较对象。
安卓
在 Android 中,启用优化后,Proguard 会将没有函数和属性的枚举转换为整数。这样,您就可以在编译时获得枚举的类型安全性以及在运行时获得 int 的性能!
密封类
垃圾收集
密封类只是普通类,唯一的例外是它们需要在同一个包和同一个编译单元中进行扩展。因此,他们的表现与普通课程相当。
密封类的子类型的对象像常规类的对象一样被垃圾收集。因此,您必须承担垃圾收集和创建对象的成本。
需要考虑的因素
当您的内存限制较低时,如果您需要数千个对象,您可以考虑使用密封类而不是枚举。因为垃圾收集器可以在内存不足且对象未使用时收集对象。
如果您使用object 声明来扩展密封类,则对象充当单例并且它们不会被垃圾回收,这种行为类似于枚举。但是加载关联的类并将它们保存在内存中会产生额外的成本,因为object 声明具有与底层对象同名的关联类。
比较
when 表达式中密封类的类型比较较慢,因为在底层它使用instanceof 来比较类型。在这种情况下,枚举和密封类之间的速度差异很小。仅当您在循环中比较数千个常量时才有意义。
安卓
Proguard 没有任何整数优化,如密封类的枚举。因此,如果您想在 Android 中只使用没有函数和属性的常量,那么坚持使用枚举是一个更好的主意。
就是这样!希望对您有所帮助。