在一个接口中,我以这种方式存储常量(我想知道你对这种做法的看法).这只是一个虚拟的例子.
interface HttpConstants {
/** 2XX: generally "OK" */
public static final int HTTP_OK = 200;
public static final int HTTP_CREATED = 201;
public static final int HTTP_ACCEPTED = 202;
public static final int HTTP_NOT_AUTHORITATIVE = 203;
public static final int HTTP_NO_CONTENT = 204;
public static final int HTTP_RESET = 205;
public static final int HTTP_PARTIAL = 206;
...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以迭代在这个接口中声明的所有常量?
Tom*_*ros 20
使用反射:
Field[] interfaceFields=HttpConstants.class.getFields();
for(Field f:interfaceFields) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
但无论如何,如果你可以重新设计你的类,我会建议你处理静态枚举常量结构.所以,对你的类来说,每个常量都会包含一个int值:
enum HttpConstants {
HTTP_OK(200), HTTP_CREATED(201), HTTP_ACCEPTED(202),
HTTP_NOT_AUTHORITATIVE(203),HTTP_NO_CONTENT(204),
HTTP_RESET(205), HTTP_PARTIAL(206) /* ... */;
private int value;
HttpConstants(int aValue) {
value=aValue;
}
public int getValue() {
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,循环它:
for(HttpConstants val: HttpConstants.values()) {
int value=val.getValue();
//...
}
Run Code Online (Sandbox Code Playgroud)
因此,避免访问反射API.
我会创建这些常量作为枚举.Java中的枚举可以有自己的字段和方法,非常方便您的使用.所以我会通过以下方式执行此操作:
enum HttpConstant {
HTTP_OK(200),
HTTP_CREATED(201),
HTTP_ACCEPTED(202),
HTTP_NOT_AUTHORITATIVE(203),
HTTP_NO_CONTENT(204),
HTTP_RESET(205),
HTTP_PARTIAL(206);
private final int id;
HttpConstant(int id) {
this.id = id;
}
int getId() {
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
现在迭代很简单:
for (HttpConstant constant : HttpConstant.values()) {
//Do something with the constant
}
Run Code Online (Sandbox Code Playgroud)
这样,添加一些新值和常量也很容易,你只需要添加新的字段.
现在你可以使用反射:
Field[] interfaceFields = HttpConstants.class.getFields();
for (Field field : interfaceFields) {
int constant = field.getInt(null);
//Do something with the field
}
Run Code Online (Sandbox Code Playgroud)
但是,最好将该方法与枚举一起使用,因为反射编码错误会导致运行时异常而不是编译时错误.