2012-02-23 105 views
4

如果我在枚举类型中有一堆枚举实例,并且如果我第一次访问它的一个实例,则它的所有其余实例也会同时被初始化。有没有什么办法只有在第一次访问枚举实例时才初始化枚举实例?Java延迟加载枚举实例

+0

你为什么要这么做? – 2012-02-23 06:51:02

+1

我没有一个具体的用例,但想知道 - 如果创建一个枚举实例是昂贵的(比如它从DB创建实例中读取某些东西),那么创建一个实例只有当它是要求。 – shrini1000 2012-02-23 06:53:15

+1

我有一个非常具体的案例。如果要在计算机视觉项目中搜索图像对象,我需要存储枚举。他们很可能被多次搜索,但我不想将它们与应用程序一起初始化。 – 2015-02-05 19:44:01

回答

8

不是没有,基本上使它不再是enum了。 Enums are classes。第一次使用类时,它将被JVM加载并完成其所有静态初始化。设置枚举成员是一个静态初始化,所以它们都将被初始化。

4

您可以使实例延迟加载使用。即构造函数实际上并不执行昂贵的工作。在这些枚举的方法中,您需要为需要此方法的方法添加一个checkedLoaded()方法。这并不是每种方法都取决于它的功能。

+1

有趣的想法,虽然开发人员将不得不考虑线程安全。 – 2013-08-01 19:45:37