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

BuZ*_*uZz 13 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;

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


Mal*_*olm 6

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

但是,最好将该方法与枚举一起使用,因为反射编码错误会导致运行时异常而不是编译时错误.