gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:32:15 26 4
gpt4 key购买 nike

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

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

但是,一旦枚举的所有成员都完成加载,我就不再需要这个对象了。处理这个问题的最佳实践是什么?看来我的选择是:

  1. 在某个地方有一个私有(private)静态对象,该对象在枚举完成初始化后仍然存在,从而造成伪内存泄漏。 (完成后我也可以将其 null 删除,但是我仍然有一个无用的静态引用,而且仍然很丑陋。)
  2. 每次调用枚举构造函数时都会创建并重新创建对象。
  3. 使字段成为非final,并使用静态初始化 block ,该 block 只需要创建函数对象一次,然后循环遍历枚举并在构造函数外部初始化字段。

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

最佳答案

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

静态初始化器非常丑陋,每当我看到它们时都会立即引发警告标志。稍后清空的静态对象同样也不那么优雅。

如果您可以接受工厂调用,那么所有“静态可怕的事情”都可以限制在工厂类中。

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

另请参阅此处,有一种方法可以通过依赖项注入(inject)框架来做到这一点:

Inject bean into enum

关于java - 如何处理仅在枚举初始化期间必需的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28749441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com