Null-Object Pattern für Arrays

18/08/2008 - 01:28 von Ivan Dolvich | Report spam
Hallo,

ich möchte garantieren, dass der Client-Code nie eine null-Wert bekommt,
wenn ein Array-Feld null ist. Stattdessen soll er ein leeres Array
bekommen und von null-Checks befreit werden. Was ist die beste
Möglichkeit das zu erreichen?

1) bei der Deklaration
2) im Getter (mit oder ohne Initialisierung)
3) im Setter

oder eine Kombination aus allen?

class Foo
{
A[] as = new A[0];

getAs() {
return (as != null) ? (as) : (as = new A[0]);
}

setAs(A[] as) {
if (as == null)
return /* throw Exception */;
this.as = as;
}
}

PS: findet ihr dass der Zustand "leer" bei Arrays und Collections (und
Strings ?) vollkommen ausreicht und der Zustand "null" für diese Typen
überflüssig ist?

Gruß, Ivan
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
18/08/2008 - 02:18 | Warnen spam
"Ivan Dolvich" schrieb:
ich möchte garantieren, dass der Client-Code nie eine null-Wert bekommt,
wenn ein Array-Feld null ist. Stattdessen soll er ein leeres Array
bekommen und von null-Checks befreit werden. Was ist die beste Möglichkeit
das zu erreichen?

1) bei der Deklaration
2) im Getter (mit oder ohne Initialisierung)
3) im Setter

oder eine Kombination aus allen?

class Foo
{
A[] as = new A[0];

getAs() {
return (as != null) ? (as) : (as = new A[0]);
}

setAs(A[] as) {
if (as == null)
return /* throw Exception */;
this.as = as;
}
}



Eventuell ist es einfacher, mittels eines Indexers oder einer Auflistung zu
arbeiten. Wenn Du anstelle des Arrays eine Auflistung offenlegst (z.B.
'System.Collections.ObjectModel.Collection<T>'), kann der Benutzer zwar
Eintràge hinzufügen oder entfernen, nicht jedoch die Liste löschen.

Auf alle Fàlle halte ich 'setAs' und 'getAs' nicht für ".NET"-Stil. Indem Du
Deinen Fall nàher beschreibst làßt sich sicher eine bessere Lösung finden.

PS: findet ihr dass der Zustand "leer" bei Arrays und Collections (und
Strings ?) vollkommen ausreicht und der Zustand "null" für diese Typen
überflüssig ist?



In den meisten Fàllen reicht der Zustand "leer", aber das hàngt auch stark
vom konkreten Fall ab.

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen