【发布时间】:2013-09-08 04:35:52
【问题描述】:
我最近一直在玩弄下面的 java 模式,它帮助解决了一些代码组织问题,但我有很多关于最佳实践、性能等方面的问题。
public class Example {
private static int[] somethingList = int[128];
public static final Example somethingOne = new Example(1);
public static final Example somethingTwo = new Example(2);
public static final ExampleChild somethingThree = new ExampleChild(3); // ExampleChild would extend Example
private Example( int id ){
// checks for existing id, etc
somethingList[id] = this;
}
public static Example getById( int id ){
return somethingList[id];
}
}
该类将事物列表注册到静态变量,但有一个私有构造函数也将通过 id # 的列表保存到数组中。 Minecraft 是在野外使用它的一个例子 - 用于他们的项目类“注册表”。
几个问题:
- 如果在此之外的任何地方都没有保存 Example 的单个实例,是否调用
Example.somethingOne或Example.getById()重新运行所有这些代码,还是只运行一次?也许我对static缺少一些了解? - 您有什么理由希望
somethingOne的静态实例是公开的,而不是仅仅通过ID 调用它?似乎getById是友好的,如果你有模组/插件添加自定义项目到列表中,这里没有静态引用。
【问题讨论】:
-
这是您正在做的事情的精简示例吗?因为您在此处显示的内容应该使用 Java 枚举来完成。
-
这显然是一个纯粹的例子,但 ENUM 的主要问题是它们无法扩展。这允许添加第三个选项,它实际上是任意数量的子类,它扩展了 Example
标签: java performance static