4

假设我有一个包含 200 多个静态字段的常量类:

class AnimalConstants {
  static final int AARDVARK = 1;
  static final int ANTELOPE = 2;
  static final int BEAR = 3;
  ...
  ...
  static final int ZEBRA = 200;
}
  • 任何人都可以解释使用这些类是否对性能和内存有任何负面影响。
  • 如果将类更改为接口(例如 SwingConstants)并由某些类实现,是更好还是更糟?
  • 如果我将常量实现为 Enum 类会更好还是更糟?
4

6 回答 6

7

我不认为影响是性能或内存。

我认为这与代码的可读性、保持常量接近使用它们的位置以及对问题的基本理解等有关。

我更喜欢在更接近使用它们的位置声明常量。我相信他们更容易理解这种方式。

如果您声称 200+ 的实常数确实相关,我会感到惊讶。 如果是,它们就属于一个地方。如果不是,我会说它们应该被分成更小的部分,并声明更接近它们的使用位置。

我敢打赌,如果知道的话,会有比您人为的示例更多的上下文来改变响应。

当然,枚举很棒。但先看看我的其他评论。

于 2013-01-10T10:15:07.877 回答
2

如果将类更改为接口(例如 SwingConstants)并由某些类实现,是更好还是更糟?

--> 那将是一个常量接口模式。如果我们将接口用于常量并且它由所有类实现,但如果您正在开发 API,则就像您在公开您的实现细节一样。上面的 wiki 链接很好地解释了这一点。

在这两种方法(接口或类)中,我建议使用最终类,创建常量并static import在必要时为常量做。

如果我将常量实现为 Enum 类会更好还是更糟?

--> 使用枚举,这将是最好的方法。

于 2013-01-10T10:18:33.760 回答
2

更改已编译到另一个类中的任何值可能需要完整构建。

附录:请参阅是否可以禁用 javac 的static final变量内联?进行更彻底的检查。

于 2013-01-10T10:18:43.203 回答
2

当然enum实现比一堆int常量更笨重,但使用enum

  1. 您不需要硬编码以后可以更改的 Animals 的实际值(在您的情况下)
  2. 你不需要硬编码动物的总数,你可以简单地遍历所有动物
  3. 具有此枚举参数的方法将被正确理解(foo(Animal animal)优于foo(int animal)
  4. 您可以稍后为您的值添加其他功能enum,例如内部值isMammal
于 2013-01-10T10:13:49.103 回答
1

是的,可以创建大量常量。很难讨论负面影响,因为我们不知道任何替代方案,因为我们没有您的功能要求。

但请放心,编译器是为与人类编写的代码一起工作而编写的。拥有一堆字段可能会没问题。

我觉得常量可以很好,因为从JDK7开始就可以在switch case中使用,您可以与==进行比较,并且变量名可以提供信息。

枚举可以更好吗?是的,它可以。探索枚举的特性,看看是否有什么对你有吸引力

于 2013-01-10T10:19:18.537 回答
0

对于您的 vars(动物类型),我建议您使用 Enumerator 而不是类。随着使用它的 var 数量,它不应该成为性能问题,因为您只使用 int 原语。如果任何 var 是一个类,那么就会出现问题,因为它们需要更多的内存来维护它们的结构。我希望能澄清你的疑问(抱歉英语不好,我有点生锈了)

于 2013-01-10T10:18:09.940 回答