何时使用枚举/整数常量

12 浏览
0 Comments

何时使用枚举/整数常量

我有一个问题,就是什么时候我们应该使用枚举(Enum),什么时候我们应该使用常量(final constants)?\n我知道这个问题已经在Enums and Constants. Which to use when?上讨论过,尽管那是一个关于C#的问题。\n我的问题是为什么Android使用那么多常量而不是枚举?例如,\nContext\n在我看来,如果我们使用常量,可能存在以下风险:\n如果我们定义一个LEVEL常量\n

public static final int LEVEL_LOW=1;
public static final int LEVEL_MEDIUM=2;
public static final int LEVEL_HIGH=3;

\n当我们传递一个int参数为4时,它不会出现编译错误,而如果我们传递一个数字1,代码阅读者可能不容易知道它的含义。\n但是枚举可以解决这个问题,尽管它可能会导致更多的开销,因为它是一个对象。\n所以为什么Android使用常量而不是枚举?\n在这种情况下,是否有什么原则来决定何时使用常量或枚举?

0
0 Comments

当在Java中使用枚举时,每个值都必须进行"翻译",这会消耗CPU时间和内存,而在嵌入式系统上这两者都是稀缺资源。另外,Java将代码转换为字节码,然后将字节码转换为Dalvik字节码,再通过Dalvik虚拟机执行。枚举可以表示为整数,但使用字符串的枚举存在一些开销,因为需要存储它们的名称和整数值。此外,Java不像C语言那样为枚举提供数值。因此,枚举需要占用额外的内存。

总结一下,枚举在Java中使用会导致内存消耗增加。解决这个问题的方法是在声明枚举时指定数值并避免使用字符串。另外,可以考虑使用整型常量代替枚举来减少内存消耗。

代码示例:

public enum ExampleEnum {
   VALUE1(1),
   VALUE2(2),
   VALUE3(3);
   
   private final int value;
   
   private ExampleEnum(int value) {
      this.value = value;
   }
   
   public int getValue() {
      return value;
   }
}

这样,就可以通过调用`ExampleEnum.VALUE1.getValue()`来获取枚举的整数值,避免了使用字符串和额外的内存消耗。

总之,根据具体情况,在使用枚举或整型常量时需要考虑内存消耗和性能。如果内存资源有限,可以选择使用整型常量来代替枚举,从而降低内存消耗。

0
0 Comments

当我们需要定义一组相关的常量时,我们可以使用枚举(Enums)或者整型常量(Int Constants)。然而,在何时使用枚举或整型常量这个问题上,有一些出现的原因和解决方法。

首先,枚举在使用上更加安全,更具弹性。如果我们在枚举列表上进行了改动,如果这个改动是错误的,编译时错误更容易发生。这就意味着我们可以更早地发现并修复错误。

其次,枚举更加清晰,大多数开发人员能够立即理解这些枚举项之间的联系。例如,使用enum { A, B, C }相比于psfi A = 0; psfi B = 1; psfi C = 2;更明显地表明这是一个具有联系的项的组合。

因此,除非我们在内存占用或速度等方面有明显的优势使用public static final int,我们应该始终使用枚举。

关于何时进行优化的问题,可以参考When is optimisation premature?。这个问题讨论了何时进行优化是合适的。在大多数情况下,我们应该遵循"不要过早优化"的原则,只有在确实有明显的好处时才进行优化。

我们在定义一组相关常量时,应该优先考虑使用枚举。除非我们有明确的优势使用整型常量,否则我们应该始终使用枚举。这样可以使我们的代码更加安全和清晰。

0
0 Comments

在Android历史中出现了这个问题。在Froyo之前的版本中存在未经证实的性能问题,开发人员建议不使用枚举。从Froyo开始,关于性能设计的文档被重写,具体描述如下所示:

“正如你可能已经注意到的,我们为Froyo重新编写了性能设计文档。以前的文档可能在某个时点是正确的,但已经与现实脱节。在Froyo中,文档中的每一个声明都由基准测试来证明(或者在将来进行证伪)。你可以在浏览器中查看“为性能设计”的基准测试。”

但是没有必要改变旧内容的结构。

性能问题可能与需要存储String有关。在为每个常量创建单独的类与创建多个枚举之间存在显著差异。

例如,在Java 7中,当你有一个具有两个字段的枚举时,你需要44个poll常量中的项目,而对于具有两个静态final整数的类,你只需要17个。

这两种声明在存储和使用上有很大不同。ContantEnum的简化版本可能如下所示:

class ContantEnum {

public static final Enum enum0 = new Enum("V1",0);

public static final Enum enum1 = new Enum("V2",1);

public static final Enum[] values = new Enum[] {enum0,enum1};

}

通过这种简化,你可以注意到枚举比整数需要更多的内存资源。

回答你的问题,必须理解枚举的作用。枚举的一个作用是增加编译时的类型安全性。

为了说明这一点,看看下面的例子:

public void setImportantThing(int priviledge, int rights)

public void setImportantThing(Privilege p, Right r)

在int的情况下,我们可以传递任何int值。在枚举的情况下,我们必须使用正确的值。

我们现在面临的情况是在编译时验证和运行时内存使用之间的权衡。你应该自己决定何时使用枚举,何时使用足够安全的静态int。

注意:

枚举在Java 1.5版本中引入,此前使用它们非常困难。在Android Studio Beta中,开发人员将能够使用注解来强制类型安全。

0