【问题标题】:Java enum with multiple value types具有多种值类型的 Java 枚举
【发布时间】:2013-10-25 23:01:48
【问题描述】:

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

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

这似乎按我的预期工作。我可以

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"

对于这种涉及枚举的特定场景,这是最好的方法还是有更好的方法来设置和格式化这个枚举?在此先感谢大家!

【问题讨论】:

  • 方法不应该全部大写。
  • 连枚举都没有?通常我使用驼峰式大小写,但我认为在引用永远不会更改的静态内容时,它应该全部大写,就像枚举本身一样。
  • 如果你真的有像nameabbreviationisOriginalColony这样的字段并且有一个构造函数采用(String, String, boolean),那就更好了。这样,它更具可读性,并且还有助于防止有人以错误的顺序添加其他状态的参数。
  • @SonofLysander 方法本身应该始终是驼峰式的。我只是从未见过枚举和常量的全部大写(例如,Math.PI)。
  • (我也看到了所有不是编译时常量的 static final 引用的大写,尽管我个人不喜欢这样。例如,public static final FOO = System.getProperty("foo")

标签: java enums


【解决方案1】:

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

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

根据以上所有建议,您应该这样做:

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

【讨论】:

  • @Marcin 为什么不应该是私有的?
  • 枚举构造函数是隐式私有的
  • 如何调用方法。 States.getAbbreviatedName() 将在 sysout 中打印什么?
  • 我们可以使用Status.valueOf("MASSACHUSETTS").getAbbreviatedName();Status.valueOf("MASSACHUSETTS").isOriginalColony();
  • 如果枚举不匹配,这种情况下如何设置默认值?
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多