如何处理ArrayList的默认值

Hel*_*ios 7 java

我正在创建一个包含我正在写的名为Person的类的应用程序.Person的一个字段是'aliases',它是一个ArrayList<String>.最终,别名将根据以下逻辑显示给用户:如果Person具有别名,则应显示为[Finch, Wren, Admin, etc...],否则UNKNOWN应显示.到目前为止,我已经尝试过三种方式之一:

  1. Person包含getAliases()简单地返回ArrayList副本的方法.调用者检查空数组以实现所需的行为.

  2. Person包含aliasesToString()可以调用以生成所需字符串的方法.

  3. 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设计指南?或者我有没有考虑过第四种选择?

JB *_*zet 6

第一个选择是正确的选择.模型不应该关注它的显示方式.

您不会以相同的方式在富应用程序,Web应用程序或控制台应用程序中表示此人及其别名.

即使在给定的应用程序中,您也可能以各种方式表示相同的模型.

如果您将应用程序国际化,则必须将"UNKNOWN"更改为其他内容.

因此,只需按原样返回列表(或列表的不可修改的vew),并让表示层处理表示逻辑.BTW,toString()比用于表示应用程序中的对象的函数方法更像是调试帮助.