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

How to handle objects only necessary during enum initialization

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

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

但是,一旦枚举的所有成员都完成加载,我就没有用这个对象了。处理这个问题的最佳做法是什么?看来我的选择是:

  1. 在某个地方有一个私有静态对象,它在枚举完成初始化后仍然存在,从而造成伪内存泄漏。 (完成后我也可以 null 出来,但是我仍然有一个无用的静态引用,它仍然很难看。)
  2. 每次调用枚举构造函数时创建并重新创建对象。
  3. 使字段成为非final并使用只需要创建函数对象一次的静态初始化程序块,然后遍历枚举并在构造函数之外初始化字段。

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

我认为选项 2 的变体会很好,因为对于 X 值的枚举,构造函数仅被调用 X 次。

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

如果你能忍受工厂调用,那么所有 "static awfulness" 都可以限制在一个工厂 class 中。

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

另请参阅此处,有一种方法可以通过依赖注入框架执行此操作:

Inject bean into enum