我们应该使用代表恒定的串例如浏览器的用户代理或使用公开静态最后的串作为以前?
使用作为enum的公开静态决赛有许多问题,例如:

  • 不是typesafe -,因为类型是您能通过按其他int价值需要,或者把二个类型加起来(没有道理)一种特殊类型的int。 这是特别引人注目的在您将发现用于无关的地方的奇怪的常数的C程序,仍然它似乎运作,因为必需的恒定和提供的恒定的份额同一int价值。
  • 没有namespace -您必须给int enum的常数加前缀以串避免与其他int enum类型的碰撞。
  • 易碎性-,由于这样enums是编译时间的常数,他们被编写入使用他们的客户。 如果一个新的常数增加在二个现有的常数之间或改变命令,客户必须重新编译。 如果他们不是,他们将跑,但是他们的行为将是未定义。
  • 打印的价值也许是不提供信息的-与作为enum的int (在公开静态决赛int),如果您打印一出来全部您得到是数字,什么都不告诉您关于什么它代表,甚至什么类型它是。 在Java enums您取得进展充分的类型信息在价值上。

避过这些问题通过使用Typesafe Enum样式(如下解释)是可能的,但是这个样式有它自己的问题: 它是相当絮絮叨叨的,因此易出错和它的enum常数不可能用于开关语句。

这是typesafe enum样式的例子,使用代表的类常数:

//The typesafe enum样式
公开类衣服{
    私有最后的串名字;
    公开静态最后的衣服棍打=新的衣服(“俱乐部”);
    公开静态最后的衣服金刚石=新的衣服(“金刚石”);
    公开静态最后的衣服心脏=新的衣服(“心脏”);
    公开静态最后的衣服锹=新的衣服(“锹”);    

    专用套装(串名字) {
        this.name =name;
    }
    toString公开的串() {
        回归名字;
    }
}

与enums的同一个例子是:

公开enum衣服{俱乐部、金刚石、心脏,锹}

那是简单的不是它?

要代表串作为enum,我使用:

公开enum UserAgent {
        IE (“IE用户代理”),
        FIREFOX (“Firefox用户代理”);

        userAgent私有最后的串;
        私有UserAgent (userAgent的串) {
            this.userAgent = userAgent;
        }
        toString公开的串() {
            回归userAgent;
        }
    }

这确实不简单比:

公开静态最后的串IE = “IE用户代理”;
公开静态最后的串FIREFOX = “Firefox用户代理”;

然而与Java enums我得到类型安全(人们不可能通过一些破烂物,当我期待一个已知的用户代理)时和情报类型。 您是否看任何其他好处或一个单一方式完成同样?