In Java, how to iterate on the constants of an interface?

前端 未结 6 1244
心在旅途
心在旅途 2021-02-07 12:51

in an interface, I store constants in this way (I\'d like to know what you think of this practice). This is just a dummy example.

interface HttpConstants {
    /         


        
相关标签:
6条回答
  • 2021-02-07 13:18

    Using reflection:

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

    But anyway, if you can redesign your class, I would recomend you to handle a static enum constants construction. So, suposing your class will contain always an int value for every constant:

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

    Then, to loop on it:

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

    Thus, avoiding the access to the reflection API.

    0 讨论(0)
  • 2021-02-07 13:19

    I'd like to know what you think of this practice

    Consider using an enum instead of an interface with constants.

    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);
        }
    }
    
    0 讨论(0)
  • 2021-02-07 13:21
    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;
        }
    }
    

    with HttpConstant.values().

    0 讨论(0)
  • 2021-02-07 13:23

    I would create these constants as an enumeration. Enums in Java can have their own fields and methods, which very convenient for your case. So I would do this the following way:

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

    Now the iteration is easy:

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

    This way it is also easy to add associate some new values with the constants, you just have to add new fields.

    Right now you may use reflection:

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

    However, it is better to use the approach with enums because with reflection coding errors result in runtime exceptions instead of compile-time errors.

    0 讨论(0)
  • 2021-02-07 13:34

    Well usually when i have something like that i make a Map in the interface that has the keys - constant names with values constant - values.

    And that's how i can iterate over them.

    0 讨论(0)
  • 2021-02-07 13:35
    for(Field f : HttpConstants.class.getFields()){
           int constant = f.getInt(null);
    }
    
    0 讨论(0)
提交回复
热议问题