gpt4 book ai didi

java - 何时使用 Enum/Int 常量

转载 作者:太空狗 更新时间:2023-10-29 22:52:59 24 4
gpt4 key购买 nike

我有一个问题,我们什么时候应该使用 Enum,什么时候应该使用 final 常量?

我知道它已经在 Enums and Constants. Which to use when? 上讨论过尽管这是 C# 问题。

我的问题是为什么 Android 使用这么多常量而不是枚举?例如 , Context

在我看来,如果我们使用常量,可能会有如下风险:如果我们定义一个 LEVEL 常数

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

当我们传递一个 int =4 的参数时。它不会有编译错误,如果我们传递一个数字 1,代码阅读者可能不容易知道它的意思。

但是 Enum 可以解决这个问题,虽然它可能会导致更多的开销,因为它是 Object。

那么为什么 Android 使用常量而不是枚举呢?在这种情况下,我们什么时候应该使用常量或枚举有什么原则吗?

最佳答案

这跟android的历史有关。 Froyo 之前的版本存在未经证实的性能问题。开发人员建议不要使用枚举。自 Froyo 以来,性能设计文档已按所述重写 here .

As you may have noticed, we rewrote the Designing for Performance documentation for Froyo. Previously it was a bunch of stuff that may have been true at some point, but had long ceased to bear any relationship to reality. In Froyo, every single claim in the document is backed by a benchmark to prove (or, in future, disprove) it. You can peruse the "Designing For Performance" benchmarks in your browser.

但是改变遗留内容的结构没有意义。

性能可能与需要存储的字符串有关。为每个常量创建单个类与为多个枚举创建一个类之间存在显着差异。

例如,在 Java 7 中,当您有一个包含两个字段的枚举时,您需要 44 个轮询常量项,而对于一个包含两个静态最终整数的类,您只需要 17 个。

有什么区别

class ContantField {
public static final int f1 = 0;
public static final int f2 = 1;
}

enum ContantEnum {
E1,E2
}

这两个声明在存储和使用方式上有很大不同。 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};
}

通过这种简化,您可以注意到 enumint 需要更多的内存资源。

要回答你的问题,必须理解枚举的作用。 enum 的作用之一是提高编译时类型安全性。

要指出这一点,请看这个例子:

public void setImportantThing(int priviledge, int rights)

public void setImportantThing(Privilege p, Right r)

int 的情况下,我们可以传递任何 int 值。在 enum 的情况下,我们被迫使用正确的。

我们这里的案例是编译时验证和运行时内存使用之间的权衡。您应该自己决定何时使用 enum 以及在何处使用 static int 足够安全。

注意: 枚举是在 1.5 版中引入 Java 的,在此之前使用它们会出现很多问题 more .

在 Android Studio Beta 中,开发者将能够使用注解强制类型安全。

关于java - 何时使用 Enum/Int 常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24491160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com