gpt4 book ai didi

java - 是否可以使用枚举通过注释映射 Spring 组件?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:46:27 25 4
gpt4 key购买 nike

我正在使用 Spring 4,我有一个枚举声明为...

public static enum MY_ENUMS {
A(1, "enum1"),
B(2, "enum2");

private final int key;
private final String name;

MY_ENUMS(int key, String name) {
this.key = key;
this.name = name;
}

public String getName() {
return this.name;
}

public int getIndex() {
return this.key;
}
}

然后,在我的组件中,我尝试做一些类似...

// @Named is the equivalent of @Component for this use case
// Making name public and trying this also does not work:
// @Named(MY_ENUMS.A.name)
@Named(MY_ENUMS.A.getName())
public class ServiceImplA implements IService {

@Override
public Object interfaceMethod() {
// Some code specific to ServiceImplA here....
}
}

这不会构建,我知道为什么这不会构建。基本上,MY_ENUMS.A.getName() 在编译器看来不是常量,这意味着它不能在这里使用。但枚举的要点是它们允许您以一种有用的方式声明常量的方法。因此,话虽如此,有没有一种方法可以通过引用枚举中的值来指定组件的名称?

我觉得这应该是可能的,因为枚举是常量值的特例/实现,但我想不出一种方法来解决 Spring(或者可能是 Java)对注释值是直线上升的期望常量。

最佳答案

is there a way I can specify my component's name by referring to the value in the enum?

不,没有。如果注释属性需要一个 enum,您可以只使用 enum。但是调用方法不会解析为常量表达式。您可能认为可以将字段设置为public 并直接访问它

@Named(MY_ENUMS.A.name)

但这也行不通,因为 MY_ENUMS.A.name 也不是常量表达式。

theat 不是常量表达式的真正原因是枚举常量基本上是一个变量。有一个常量变量,它是一个常量表达式。要使变量成为常量变量,它需要是 final 并使用常量表达式进行初始化。 enum 常量是 final 但未使用常量表达式初始化。基本上 enum 常量被编译为

public static final YourEnum constant = new YourEnum();

new YourEnum() 表达式不是常量表达式。因此常量不是常量变量,不能用于解析可能是常量变量的 String 变量。

关于java - 是否可以使用枚举通过注释映射 Spring 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232384/

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