我应该避免使用STATIC变量

时间:2011-06-06 00:56:12

标签: java performance static

我正在我的办公室设计一个java API(不是一个API),它将包含4000多个常量。所以所有团队都可以直接使用它们。最初我想根据它们的类型创建它们的类,并将它们的静态对象创建为一个单独的类。所以任何人都可以直接使用它们。

但在阅读need of static variable之后,我担心这可能是创建这么多静态变量的问题。有替代品吗?

*在我之后谁将加入这个项目也可以在我的Constant类中添加一个约束而不需要考虑性能。很可能很少使用许多常数。

* Constant类的每个成员都将表示一个具有自己行为的类。它可能是某些继承树的一部分。所以使用枚举可能不是一个好主意。

4 个答案:

答案 0 :(得分:4)

您想要创建一个容纳4000多个常量的位置。这个类的用户可能会添加常量(可能在运行时)? Ť

  • 关于静力学的记忆问题的关注是错误的。如果你需要4000个价值,他们将不得不住在某个地方,对吧?

  • 如果人们在运行时添加值,这听起来像是单独的Map或属性(实际上它只是一种地图)。人们经常使用依赖注入框架(如Spring或Guice)来管理这类事情。

  • 如果您只是意味着添加编译常量,则可以将它们全部设为静态。你可能想让它们成为静态最终版本,它们将被内联编译。

  • 4000个常数很可能是一个非常糟糕的主意。我曾经看到在一个地方定义了大量常量(> 100,偶数)的系统,通常会发生的事情是人们忘记了它们的定义并最终使用了自己的变体,这有点挫败了目的(对于例如,我在一个系统中使用了在“查询”类中定义的100个SQL查询。当然人们会立即忽略它,因为如果您需要的确切查询在那里而不是滚动您的查找更麻烦这个类最终变成1500个查询,许多完全重复,许多未使用,最常用过一次。毫无意义。我可以想象你不会在命名约定中“丢失”的异常,但除非你有一个像这样的用例,这似乎是真的坏主意。

  • 将常量分解为枚举可为您提供类型安全的引用。它还使概念上更容易处理。比较:

-

public class Constants { 
   String WORK_ADDRESS;
   String WORK_PHONE;
   String HOME_ADDRESS;
   String HOME_PHONE;
}

public enum ADRESS{ WORK, HOME }
public enum PHONE { WORK, PHONE }

你愿意和谁合作?

答案 1 :(得分:3)

此设计不太可能出现性能问题。 RAM很便宜。 (提示通常的引用:过早优化是所有邪恶的根源。

另一方面,我不太确定任何客户端开发人员如何记住并使用4000多个常量。你能告诉我们这是什么类型的对象吗?

根据您未提供给我们的详细信息,您可能会发现将常量收集到enum中非常有用。如果有一些自然分组可以利用,那么无状态枚举比public static final变量更容易理解。

答案 2 :(得分:2)

在静态分配时会发生什么,它肯定不会在您的应用程序的运行时中释放。

那又怎样?

如果你不创建静态,那么它们将在你的每个类实例中重复。

您不想做的是设置静态大量数据,如图像或GUI 一个图像比几个领域占用更多;

4000个常数肯定是int(4个八位字节)= 16000个八位字节甚至不是图标的大小^^

我会指出用Javadoc来证明我的观点

http://download.oracle.com/javase/1.4.2/docs/api/constant-values.html#java.awt.event.KeyEvent.CHAR_UNDEFINED

这是Java中的KeyEvent decleration,检查out声明^^

答案 3 :(得分:2)

除非您要创建大型数组或非常长的字符串,否则4000个数据值不会占用大量内存。我认为你引用的帖子是在谈论更多的数据。

另一种方法是从首选项文件中读取值。

也许常量被模块化为一个类的集合,因此更少使用的常量将仅按需加载。