如何处理仅在枚举初始化期间需要的对象



我有一个Enum类,它需要一个函数对象(在本例中是Guava的StringConverter之一)来初始化其中一个字段。它可能看起来像这样:

private MyEnum(String input) {
  this.myField = someFunctionObject.convert(input);
}

然而,一旦枚举的所有成员都完成了加载,我就不再使用这个对象了。处理此问题的最佳做法是什么?我的选择似乎是:

  1. 在枚举完成初始化后,在某个位置保留一个私有静态对象,从而导致伪内存泄漏。(我也可以在完成后null它,但我仍然有一个无用的静态引用,它仍然很难看。)
  2. 每次调用枚举构造函数时,创建并重新创建对象
  3. 使字段为非final,并使用只需要创建一次函数对象的静态初始化器块,然后在枚举上循环并在构造函数之外初始化字段

这并不是什么大不了的事,但这个过程已经出现过几次了,我不喜欢这些解决方案中的任何一个。我也不认为这是一个过早的微观优化问题,这是一种最优雅/可读/明智的执行方式的问题。

我认为选项2的变体是可以的,因为对于X值的枚举,构造函数只被调用X次。

静态初始化程序非常难看,每当我看到它们时都会立即发出警告标志。后来为null的静态对象也同样不那么优雅。

如果你能接受一个工厂调用,那么所有的"静态可怕"都可以被限制在一个工厂类中。

private MyEnum(String input) {
    this.myField = SomeFunctionFactory.getInstance().convert(input);
}

也请看这里,有一种方法可以通过依赖注入框架做到这一点:

将bean注入枚举