我正在创建一个应用程序,其中包含我正在编写的名为 Person 的类。 Person 的字段之一是“别名”,它是 ArrayList<String>
.最终,别名将根据以下逻辑显示给用户:如果 Person 有别名,那么它们应该显示为 [Finch, Wren, Admin, etc...]
。 , 否则 UNKNOWN
应该显示。到目前为止,我已尝试通过以下三种方式之一实现此目的:
人包含方法
getAliases()
它只是按原样返回 ArrayList 的副本。调用者检查空数组以实现所需的行为。人包含方法
aliasesToString()
可以调用它来生成所需的字符串。而不是使用
ArrayList<String>
, aliases 是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();
}
}
}
关于选项 2 和 3,我担心的是我可能会在违反 OOP 指南的同时添加不必要的复杂性。 Person 真的应该关心如果没有别名会发生什么吗?别名定义它最终如何在应用程序中实现是否有意义?我认为我应该让来电者处理空箱。我应该选择哪个选项最符合标准 OOP 设计指南?还是有第四种我没有考虑过的选择?
最佳答案
第一个选项是正确的。模型不应该关心它的显示方式。
在富应用程序、Web 应用程序或控制台应用程序中,您不会以相同的方式表示此人和他/她的别名。
即使在给定的应用程序中,您也可能会以不同的方式表示同一模型。
如果您将应用程序国际化,则必须将“UNKNOWN”更改为其他内容。
因此,只需按原样返回列表(或列表的不可修改 View ),并让表示层处理表示逻辑。顺便说一句,toString()
与其说是一种用于表示应用程序中对象的功能方法,不如说是一种调试帮助。
关于java - 如何处理 ArrayList 的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30951326/