我有一个定义了许多东西的类,即目标名称和参数数组:
public class Actions {
protected static final String A_TARGET = "do_a";
protected static final String[] A_ARGS = { "paramA", "paramB" };
...
}
我正在尝试编写自定义注释以避免在构造函数中进行操作注册,因此我已定义:
public @interface MyAnno{
String actionTarget();
String[] actionArgs();
}
我正试图这样使用它:
@MyAnno(
actionTarget = Actions.A_TARGET,
actionArgs = Actions.A_ARGS <-- compile error
)
public void doA() {
}
然而,我遇到了标记行的问题,这是将参数的String数组传递给注释的问题:
注释属性MyAnno.A_ARGS的值必须是数组初始值设定项
如果我将Actions.A_ARGS
替换为我在Actions
类{ "paramA", "paramB" }
中定义的数组,则错误就会消失......
我的问题是:
如何在其他地方定义这个args数组,然后在Annotation中使用它?
答案 0 :(得分:2)
这在Java中是不可行的。
详情请见此问题:How to supply value to an annotation from a Constant java
最好的办法是将各个数组项定义为常量并重用它们,即
def b58encode(fid):
CHARS = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
CHAR_NUM = len(CHARS)
encoded = ''
fid = int(fid)
while fid >= CHAR_NUM:
div, mod = divmod(fid, CHAR_NUM)
encoded = CHARS[mod] + encoded
fid = div
return CHARS[fid] + encoded
print(b58encode(2222223333333))
然后
public class Actions {
protected static final String A_TARGET = "do_a";
protected static final String PARAM_A = "paramA";
protected static final String PARAM_B = "paramB";
protected static final String[] A_ARGS = { PARAM_A, PARAM_B };
...
}
这有助于避免“字符串重复”和拼写错误,但无法解决组合的重复问题。
答案 1 :(得分:1)
您不能将静态数组字段值用作注释的值,因为它不是常量表达式。
请考虑以下示例:
@Target(ElementType.METHOD)
public @interface MyAnno {
String[] arrayParam();
String stringParam();
}
public static final String[] arrayConstant = {"x", "y"};
public static final String stringConstant = "z";
static {
stringConstant = "t"; // error, final string cannot be changed
arrayConstant[0] = "t"; // valid (thus array is not constant)
}
@MyAnno(
arrayParam = arrayConstant, // error, array is not a constant
stringParam = stringConstant // valid, static final string field is a constant
)
void myMethod() {
}
静态final字符串字段是正确的常量表达式,因为它们无法在运行时更改,因此编译器将它们标记为常量。
静态最终数组字段总是可以在运行时更改,因此compliler不能将其标记为常量。