在Java中,如何迭代接口的常量?

在一个接口中,我以这种方式存储常量(我想知道你对这种做法的看法)。 这只是一个虚拟的例子。

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; ... } 

有没有办法可以迭代在这个接口中声明的所有常量?

使用reflection:

 Field[] interfaceFields=HttpConstants.class.getFields(); for(Field f:interfaceFields) { //do something } 

但无论如何,如果你可以重新设计你的类,我会建议你处理静态枚举常量结构。 所以,对你的类来说,每个常量都会包含一个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; } } 

然后,循环它:

  for(HttpConstants val: HttpConstants.values()) { int value=val.getValue(); //... } 

因此,避免访问reflectionAPI。

我会创建这些常量作为枚举。 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; } } 

现在迭代很简单:

 for (HttpConstant constant : HttpConstant.values()) { //Do something with the constant } 

这样,添加一些新值和常量也很容易,你只需要添加新的字段。

现在你可以使用reflection:

 Field[] interfaceFields = HttpConstants.class.getFields(); for (Field field : interfaceFields) { int constant = field.getInt(null); //Do something with the field } 

但是,最好将该方法与枚举一起使用,因为reflection编码错误会导致运行时exception而不是编译时错误。

 for(Field f : HttpConstants.class.getFields()){ int constant = f.getInt(null); } 
 public enum HttpConstant { /** 2XX: generally "OK" */ 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 code; private HttpConstant(int code) { this.code = code; } public int getCode() { return code; } } 

使用HttpConstant.values()

通常,当我有类似的东西时,我在具有键的接口中创建一个Map – 值为常量的常量名称 – 值。

这就是我如何迭代它们。

我想知道你对这种做法的看法

考虑使用enum而不是带常量的接口。

 enum HttpResultCode { 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 code; private HttpResultCode(int code) { this.code = code; } public int getCode(int code) { return code; } public static HttpResultCode forCode(int code) { for (HttpResultCode e : HttpResultCode.values()) { if (e.code == code) { return e; } } throw new IllegalArgumentException("Invalid code: " + code); } }