Re: Methoden richtig schreiben
- From: "Ralf Ullrich" <news@xxxxxxxx>
- Date: Tue, 4 Jul 2006 18:49:31 +0000 (UTC)
Wanja Gayk wrote:
timo.stamm@xxxxxxxx said...Wanja Gayk schrieb:Hätte das Map-interface eine Methode
"boolean containsValueFor(Object Key);" so wäre das ggf. etwas anderes.
Hat es, sie heisst nur etwas anders:
boolean containsKey(Object key)
Returns true if this map contains a mapping for the
specified key.
Ist nicht das gleiche, weil du auch "null" auf einen Key mappen kannst.
Die Semantik der gemeinten Methode wäre gleich diesem Code:
public boolean containsValueFor(final Object Key){
return get(key) != null;
}
Kannst du das näher erklären? Ich bring das nämlich nicht mit deinem ursprünglichen Paragraphen zusammen:
"Eine Exception ist, sagt schon der Name, eine Ausnahme. Etwas anderes
ist ein erwartetes Verhalten: Nehmen wir eine Map zum Beispiel.
Dass bei einem Map#get(key) kein mapping für den key existiert, das kann
man durchaus als erwartetes Verhalten bei einer Map betrachten, also
kann die auch "null" zurück liefern. Die Map zu veranlassen eine
NotFoundException zu werfen, würde schnell zum Misbrauch einer Exception
zum Kontrollfluss. Hätte das Map-interface eine Methode
"boolean containsValueFor(Object Key);" so wäre das ggf. etwas anderes."
Es geht also doch um den Fall, dass kein Mapping existiert, sprich um den Fall: containsKey(key) == false. Und dabei darum, ob get(key) in einem solchen Fall null zurückgeben darf oder besser eine Exception (ich würde NoSuchElement benutzen) werfen soll. (BTW: containsKey ist IMHO ein schlecht gewählter Bezeichner, der wohl nur genommen wurde, weil es bei den anderen Collections schon contains() gibt. Ein besserer Bezeichner wäre hasMapping oder hasMappingFor )
Da sich die Designer für die Rückgabe von null entschieden haben (Gott sei Dank!), ist eben containsKey(key) nötig um die Zweideutigkeit zwischen einem Mapping key --> null und keinem Mapping für key auflösen zu können.
Wie soll da ein containsValueFor(key), vor allem mit dieser Semantik, helfen? Und wieso wäre das dann wie du sagst "etwas anderes"?
Achja, am allerbesten wäre übrigens ein Vorgehen wie bei Properties gewesen: Map#get(key, default), wobei "default" genau dann zurückgegeben wird, wenn es kein Mapping für key gibt. Mit dieser Methode sind alle denkbaren Anwendungen mit nur einem Methodenaufruf möglich, wo jetzt ggf. zwei gebraucht werden. Nur ein Beispiel:
Bisher:
if (map.containsKey(key)) {
Object value = map.get(key);
if (value != null) {
// Fall 1: Mapping vorhanden und Value ungleich null
} else {
// Fall 2: Mapping vorhanden und Value gleich null
}
} else {
// Fall 3: Mapping nicht vorhanden
}
Mit get(key, default):
private static final Object NOT_IN_MAP = new Object();
...
Object value = get(key,NOT_IN_MAP);
if (value == NOT_IN_MAP) {
// Fall 3: Mapping nicht vorhanden
} else if (value != null) {
// Fall 1: Mapping vorhanden und Value ungleich null
} else {
// Fall 2: Mapping vorhanden und Value gleich null
}
Mit so einem get(key, default) ließen sich auch problemlos die beiden bisherigen Methoden get(key) und containsKey(key) darstellen:
V get(K k) { return get(k, null); }
private static final Object NOT_IN_MAP = new Object();
boolean containsKey() { return NOT_IN_MAP != get(key, NOT_IN_MAP); }
Ein RFE wert?
cu
.
- Follow-Ups:
- Re: Methoden richtig schreiben
- From: Wanja Gayk
- Re: Methoden richtig schreiben
- References:
- Re: Methoden richtig schreiben
- From: Wanja Gayk
- Re: Methoden richtig schreiben
- From: Timo Stamm
- Re: Methoden richtig schreiben
- From: Wanja Gayk
- Re: Methoden richtig schreiben
- Prev by Date: Re: JTextArea als TableCellRenderer -- 100% CPU-Last
- Next by Date: Re: JTextArea als TableCellRenderer -- 100% CPU-Last
- Previous by thread: Re: Methoden richtig schreiben
- Next by thread: Re: Methoden richtig schreiben
- Index(es):
Relevant Pages
|