我应该避免使用STATIC vaiables

问题描述:

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

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

*以后我加入这个项目的人也可以在我的Constant类中添加一个约束而不关心性能。有可能许多常量很少被使用。

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

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

  • 关注静态内存问题是错位的。如果你需要4000个值,他们将不得不住在某个地方,对吧?

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

  • 如果您只是要添加编译常量,您可以使它们都是静态的。你可能也想让它们成为static final,它们将被内联编译。

  • 这很可能是4000个常量是一个非常糟糕的主意。在那里我看到在一个地方定义了大量常量(> 100,甚至是)的系统,通常会发生的情况是人们忘记了它们的定义并最终使用自己的变体,这种变体会影响目的(例如,我在一个系统上使用了一个在“Queries”类中定义的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 } 

你更愿意一起工作?

+0

我的意思是“添加更多常量”是,一旦我完成它(维护阶段),该项目将在其他开发人员下进行。如果有新的需求(或变化)出现,他们可以添加更多的常量而不关心性能。所以我想以这样的方式设计这个项目,他们至少想过一次为什么我这么做。 – noquery 2011-06-06 04:38:25

性能不太可能成为这个设计的问题。 RAM很便宜。 (提示通常的引用:不成熟的优化是所有邪恶的根源

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

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

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

那又如何?

如果您没有将它们创建为静态,那么它们将通过类的每个实例进行复制。

你不想做的事情是设置静态海量数据,如图像或图形用户界面 图像占用了很多比字段;

4000的一定的常数INT(4个八位字节)= 16000个八位组连的图标^^

的大小我想指出HTE的Javadoc证明我点

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

这是在Java中的KeyEvent删除,检查出声明^^

+0

常量类将有一些对象的值域可以是int,float,long,string,double,char等 – noquery 2011-06-06 04:34:55

除非你正在创建大型数组或很长的字符串,4000数据值不会是很多的内存。我认为你引用的这篇文章谈论的数据量更大。

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

也许这些常量被模块化为一个类的集合,所以更少使用的类只会根据需要加载。

+0

我以为是一样的。根据性能会很好,因为它需要额外的IO操作。 – noquery 2011-08-10 08:36:23