具有多种值类型的Java枚举

时间:2023-01-26 14:48:15

Basically what I've done is write an enum for States, and I want to not only be able to access them just as states but also access their abbreviation and whether or not they were an original colony.

基本上我所做的就是为各州写一个枚举,我希望不仅能够像州一样访问它们,而且还能访问它们的缩写以及它们是否是原始殖民地。

public enum States {
        ...
        MASSACHUSETTS("Massachusetts",  "MA",   true),
        MICHIGAN("Michigan",            "MI",   false),
            ...; //so on and so forth for all fifty states

        private final Object[] values;

        States(Object... vals) {
            values = vals;
        }

        public String FULL() {
            return (String) values[0];
        }

        public String ABBR() {
            return (String) values[1];
        }

        public boolean ORIGINAL_COLONY(){
            return (boolean) values[2];
        }
    }

This seems to work as I'd expect it to. I can

这看起来像我期望的那样有效。我可以

System.out.println(States.ALABAMA);                  // Prints "ALABAMA"
System.out.println(States.ALABAMA.FULL());           // Prints "Alabama"
System.out.println(States.ALABAMA.ABBR());           // Prints "AL"
System.out.println(States.ALABAMA.ORIGINAL_COLONY());// Prints "false"

For this particular scenario involving enums, is this the best way to do this or is there a better way to setup and format this enum? Thanks to all in advance!

对于这个涉及枚举的特定场景,这是最好的方法吗?还是有更好的方法来设置和格式化这个枚举?提前全部感谢!

1 个解决方案

#1


84  

First, the enum methods shouldn't be in all caps. They are methods just like other methods, with the same naming convention.

首先,enum方法不应该全部大写。它们就像其他方法一样,具有相同的命名约定。

Second, what you are doing is not the best possible way to set up your enum. Instead of using an array of values for the values, you should use separate variables for each value. You can then implement the constructor like you would any other class.

其次,你正在做的不是设置你的枚举的最好方法。您应该为每个值使用单独的变量,而不是为值使用值数组。然后,您可以像执行任何其他类一样实现构造函数。

Here's how you should do it with all the suggestions above:

以下是您应该如何使用上述所有建议:

public enum States {
    ...
    MASSACHUSETTS("Massachusetts",  "MA",   true),
    MICHIGAN     ("Michigan",       "MI",   false),
    ...; // all 50 of those

    private final String full;
    private final String abbr;
    private final boolean originalColony;

    private States(String full, String abbr, boolean originalColony) {
        this.full = full;
        this.abbr = abbr;
        this.originalColony = originalColony;
    }

    public String getFullName() {
        return full;
    }

    public String getAbbreviatedName() {
        return abbr;
    }

    public boolean isOriginalColony(){
        return originalColony;
    }
}

#1


84  

First, the enum methods shouldn't be in all caps. They are methods just like other methods, with the same naming convention.

首先,enum方法不应该全部大写。它们就像其他方法一样,具有相同的命名约定。

Second, what you are doing is not the best possible way to set up your enum. Instead of using an array of values for the values, you should use separate variables for each value. You can then implement the constructor like you would any other class.

其次,你正在做的不是设置你的枚举的最好方法。您应该为每个值使用单独的变量,而不是为值使用值数组。然后,您可以像执行任何其他类一样实现构造函数。

Here's how you should do it with all the suggestions above:

以下是您应该如何使用上述所有建议:

public enum States {
    ...
    MASSACHUSETTS("Massachusetts",  "MA",   true),
    MICHIGAN     ("Michigan",       "MI",   false),
    ...; // all 50 of those

    private final String full;
    private final String abbr;
    private final boolean originalColony;

    private States(String full, String abbr, boolean originalColony) {
        this.full = full;
        this.abbr = abbr;
        this.originalColony = originalColony;
    }

    public String getFullName() {
        return full;
    }

    public String getAbbreviatedName() {
        return abbr;
    }

    public boolean isOriginalColony(){
        return originalColony;
    }
}