Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spring注入指定私有静态最终字段成员_Java_Spring - Fatal编程技术网

Java 使用spring注入指定私有静态最终字段成员

Java 使用spring注入指定私有静态最终字段成员,java,spring,Java,Spring,是否有可能完成这样的任务。此处处理的是私有静态字段成员,但在这种情况下没有帮助,因为无法分配最终成员 使用private static final作为成员限定符的理由: 数据成员是ServiceClient,因此将其附加到类型是有意义的,因为它不依赖于实例。它也是线程安全的,因此它将提高性能,因为我不会为每个实例初始化客户端 服务客户机本身是一个bean,具有单例作用域。因此,实际上只有一个例子。因为总是会有一个实例,所以允许重新分配是没有意义的 由于此客户端只能由此类的方法使用,因此它是私有

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

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

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

我不确定这是否是反模式,但如果是,那么我的理由是否有资格使用它?如果是的话,那怎么做呢。如果没有,那么请建议一个替代方案(我仍然有兴趣知道如何实现这一点,只是为了了解情况)。

您试图做的根本不可能

最根本的原因是Java将代码中出现的
静态final
变量替换为实际值(因为它在编译时是已知的)。检查,以便回答更多细节

即使您不使用
final
,Spring仍然不允许您直接将值注入
静态
变量。您必须使用如下设置器:

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

查看SO answer以了解更多信息。

如果您没有当场或在构造函数中初始化
final
成员,则不能将其标记为final-抱歉,这是Java编程语言设计。类似的情况是CDI注入,其中注入的字段通常是包私有的(也不是最终的),以使单元测试的注入成为可能,而不使用setter。您可以使用类上的反射以及该字段的
字段
类本身上的反射来删除其
最终
修饰符。检查一下本质。备选方案(考虑到我用作理由的约束条件)?稍后我会再与您联系