Java 使用字符串包装器是更好的设计吗?

Java 使用字符串包装器是更好的设计吗?,java,Java,有人建议我使用字符串包装器而不是字符串,目的是让我清楚地知道字符串代表什么 例如,我有以下枚举 public enum Priority { PRIORITY_URGENT("urgent"), PRIORITY_HIGH("high"), PRIORITY_LOW("low"); private String _piorityLevel; private Priority(String level) { _priorityLevel = leve

有人建议我使用字符串包装器而不是字符串,目的是让我清楚地知道字符串代表什么

例如,我有以下枚举

public enum Priority
{
   PRIORITY_URGENT("urgent"),
   PRIORITY_HIGH("high"),
   PRIORITY_LOW("low");

   private String _piorityLevel;
   private Priority(String level)
   {
     _priorityLevel = level;
   }

   public String getPriorityLevel()
   {
     return _priorityLevel;
   }
   ....
}
将优先级字符串包装为PriorityLevel这样的新类,以明确表示如下所示的优先级,这是更好的设计吗

public enum Priority
{
   PRIORITY_URGENT(new PriorityLevel("urgent")),
   PRIORITY_HIGH(new PriorityLevel("high")),
   PRIORITY_LOW(new PriorityLevel("low"));

   private PriorityLevel _piorityLevel;
   private Priority(PriorityLevel level)
   {
     _priorityLevel = level;
   }

   public PriorityLevel getPriorityLevel()
   {
     return _priorityLevel;
   }
   ....
}

Java中缺少程序员定义的隐式转换运算符,这使得编写字符串包装器有些麻烦。
toString
约定有帮助,但在许多情况下,转换是明确的

想象一下API用户将要对
PriorityLevel
属性执行的一个常见操作:在任何需要它作为
字符串的地方,他们都必须编写它

Priority priority = Priority.PRIORITY_URGENT;
String level = priority.getPriorityLevel().toString();
最后一个
toString()
调用很烦人。虽然在这种情况下你可以避免

System.out.println("This job has " + priority.getPriorityLevel() + "priority");

最好不要去想它。毕竟,
enum
已经为字符串提供了足够的包装,因此不需要第二个级别。

第一个enum就足够了。第二个包装器是不必要的

也就是说,你为什么不这样做呢

public enum Priority {
   URGENT,
   HIGH,
   LOW;
}
如果需要字符串表示,请使用
toString()

for (Priority priority : Priority.values()) {
    System.out.print(priority);
}   
印刷品:

急迫的


一般来说,最好不要陷入太深,但由于您的示例是一个
枚举
,您已经有了强大的键入功能,并且没有明显的理由将字符串值包装到其他层中

您希望避免过度使用
String
和其他原语的原因是为了使代码更明确地表达域概念,并避免(在编译时)简单的编程错误,例如当方法签名类似于

public String doSomething(String name, String id, String address)
而不是

public Result doSomething(Name name, Id id, Address address)

我认为这还不足以回答问题,但按照我的阅读方式,
Priority
enum已经是一个字符串包装器,因此为
PriorityLevel
添加第二级包装器对我来说似乎是多余的。