【问题标题】:Assigning private static final field member using spring injection使用弹簧注入分配私有静态最终字段成员
【发布时间】:2014-08-12 15:12:19
【问题描述】:

是否有可能完成这样的任务。这里的 article 处理 private static 字段成员,但在这种情况下它没有帮助,因为最终成员无法分配。

使用private static final 作为成员限定符的理由:

  • 数据成员是一个 ServiceClient,因此将它附加到类型是有意义的,因为它不依赖于实例。它的线程也是安全的,因此它会提高性能,因为我不会为每个实例初始化客户端。
  • 服务客户端本身是一个bean,具有单例范围。因此实际上只有一个实例。由于总会有一个实例,因此允许重新分配是没有意义的。
  • 由于这个客户端只被这个类的方法使用,它是私有的。

我不确定这是否是反模式,但如果是,那么我的理由是否有资格使用它?如果是,那该怎么做。如果不是,那么请提出一个替代方案(我仍然很想知道如何实现这一点,仅出于知识目的)。

【问题讨论】:

  • 如果您没有在现场或在构造函数中初始化final 成员,则无法将其标记为最终 - 这是 Java 编程语言设计,抱歉。类似的情况是 CDI 注入,其中注入的字段通常是包私有的(也不是最终的),以便在不使用 setter 的情况下进行单元测试的注入。
  • 您可以对类使用反射以及对Field 类本身的反射,以删除其final 修饰符。查看this question here 了解详情。

标签: java spring


【解决方案1】:

你想要做的,根本不可能。

最根本的原因是Java用实际值替换了代码中出现的static final“变量”(因为它在编译时当然是已知的)。查看this SO 回答了解更多详情。

即使您不使用final,Spring 仍然不允许您直接将值注入static 变量。您将不得不使用像这样的设置器:

@Value("${my.name}")
public void setPrivateName(String privateName) {
    Sample.name = privateName;
}  

查看this SO 回答了解更多信息。

【讨论】:

  • 替代方案(考虑到我用作理由的约束)?
  • 我稍后会回复你
猜你喜欢
  • 2012-09-29
  • 2012-07-04
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 2015-08-22
  • 2011-03-19
相关资源
最近更新 更多