我正在创建一个包含我正在写的名为Person的类的应用程序.Person的一个字段是'aliases',它是一个ArrayList<String>.最终,别名将根据以下逻辑显示给用户:如果Person具有别名,则应显示为[Finch, Wren, Admin, etc...],否则UNKNOWN应显示.到目前为止,我已经尝试过三种方式之一:
Person包含getAliases()简单地返回ArrayList副本的方法.调用者检查空数组以实现所需的行为.
Person包含aliasesToString()可以调用以生成所需字符串的方法.
ArrayList<String>别名是一种实现,而不是使用DefaultableArrayList<T>.此类扩展了ArrayList并保存了类型为T的默认值.该toString()方法被覆盖以生成所需的字符串.应用程序调用some_person.getAliases().toString()以产生所需的行为.
以下是我对选项3的实现:
public class DefaultableArrayList<T> extends ArrayList<T> {
private static final long serialVersionUID = -6735356930885363889L; // Auto-generated
private final T defaultElement;
public DefaultableArrayList(T defaultElement) {
super();
this.defaultElement = defaultElement;
}
public DefaultableArrayList(Collection<? extends T> c, T defaultElement) {
super(c);
this.defaultElement = defaultElement;
}
public DefaultableArrayList(int initialCapacity, T defaultElement) {
super(initialCapacity);
this.defaultElement = defaultElement;
}
public T getDefaultElement() {
return defaultElement;
}
@Override
public String toString() {
if (!isEmpty()) {
return super.toString();
} else {
return defaultElement.toString();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我对选项2和3的关注是,我可能会在违反OOP指南的同时增加不必要的复杂性.如果没有别名,人们真的应该关注会发生什么,并且别名是否有意义定义它最终如何在应用程序中实现?我认为我应该让调用者处理空案例.我应该选择哪种方案最符合标准OOP设计指南?或者我有没有考虑过第四种选择?
第一个选择是正确的选择.模型不应该关注它的显示方式.
您不会以相同的方式在富应用程序,Web应用程序或控制台应用程序中表示此人及其别名.
即使在给定的应用程序中,您也可能以各种方式表示相同的模型.
如果您将应用程序国际化,则必须将"UNKNOWN"更改为其他内容.
因此,只需按原样返回列表(或列表的不可修改的vew),并让表示层处理表示逻辑.BTW,toString()比用于表示应用程序中的对象的函数方法更像是调试帮助.
| 归档时间: |
|
| 查看次数: |
871 次 |
| 最近记录: |