繁体   English   中英

我应该避免使用 STATIC 变量吗

[英]Should i avoid using STATIC vaiables

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

但是在阅读了 static 变量的需要之后,我担心创建这么多 static 变量可能是个问题。 有替代品吗?

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

*常量 class 的每个成员都将代表一个 class ,它会有自己的行为。 它可能是一些 inheritance 树的一部分。 所以使用枚举可能不是一个好主意。

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

  • 对 memory 静力学问题的担忧是错误的。 如果您需要 4000 个值,它们将不得不存在于某个地方,对吗?

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

  • 如果您只是想添加编译常量,您可以将它们全部设为 static。 您可能还想让它们 static 最终化,它们将被内联编译。

  • 4000 个常量很可能是一个非常糟糕的主意。 我见过在一个地方定义了大量常量(甚至超过 100 个)的系统,通常发生的情况是人们忘记了它们的定义并最终使用自己的变体,这有点违背了目的(例如, 我在一个系统上工作过,在“查询”class 中定义了 100 个 SQL 查询。当然人们会立即忽略它,因为如果您需要的确切查询在那里而不是自己滚动,那么查找它更麻烦. class 最终增长到大约 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 }

您更愿意与哪个合作?

性能极不可能成为这种设计的问题。 内存很便宜。 (提示通常的引用:过早的优化是万恶之源。

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

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

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

所以呢?

如果您不创建它们 static 那么它们将在您的类的每个实例中复制。

你不想做的是设置 static 大量的数据,例如图像或 GUI 一个图像占用的不仅仅是几个字段;

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 声明,请查看声明 ^^

除非您正在创建大型 arrays 或非常长的字符串,否则 4000 个数据值不会是很多 memory。 我认为您引用的那篇文章谈论的是大量数据。

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

也许常量被模块化成一个类的集合,所以很少使用的常量只会按需加载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM