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
添加第二级包装器对我来说似乎是多余的。