我正在創建一個應用程序,其中包含我正在編寫的名爲Person的類。 Person的其中一個字段是'別名',它是ArrayList<String>
。最終,別名將根據以下邏輯顯示給用戶:如果Person具有別名,則它們應該被顯示爲[Finch, Wren, Admin, etc...]
,否則應該顯示UNKNOWN
。到目前爲止,我已經試過三種方式之一實現這一點:如何處理ArrayList的默認值
人包含方法
getAliases()
它簡單的返回ArrayList中的副本是。調用者檢查一個空數組以實現所需的行爲。人包含方法
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();
}
}
}
我關心的有關選項2和3的是,我可能同時違反OOP準則增加不必要的複雜性。如果沒有別名,人應該真的關心會發生什麼,並且確定別名如何最終在應用程序中實現時是否有意義?我認爲我應該讓呼叫者處理空箱子。我應該選擇哪種選項最符合標準OOP設計指南?還是有沒有第四個選項,我沒有考慮?
我寧願返回一個不可變的視圖:'Collections.unmodifiableList(別名)'。 –
@JBNizet'Collections.unmodifiableList(aliases)'是一個很好的選擇。它可以保護原始實例成員不被修改,並使方法的調用者清楚,他們不能通過變更別名列表來突變Person實例。 – Eran
是的,當然,對不起,我不是故意暗示我會返回一個直接引用。這是一個疏忽。 – Helios