Re: Methoden richtig schreiben



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


.



Relevant Pages

  • PrimaryKeyConstraint und das liebe Hibernate Mapping...
    ... Ich schlage mich jetzt seit einiger Zeit mit einem Mapping in Hibernate ... durch einen Primary Key Constraint verbunden sind. ... CONSTRAINT `FK52C76FDEE5995718` FOREIGN KEY REFERENCES ...
    (de.comp.lang.java)
  • Re: Hashes in REXX bzw. Limits von REXX Symboltabellen
    ... ich verwende manchmal in O-REXX den Hack, die eingebaute Symboltabelle als Map zu missbrauchen. ... Also man nehme einen Stamm und packe den Key dahinter: ... Und dann weist man der Variablen mit VALUE() einen Wert zu. ...
    (de.comp.os.os2.programmer)
  • Re: Decoding strategy
    ... Mapping is actually two-step process, ... address at which to map the file, this isn't necessary, nor does it to my ... needs physical RAM that's not available). ... This doesn't reserve any ...
    (microsoft.public.dotnet.languages.csharp)
  • behavior as mapping
    ... seeing behavior as a mapping from a very high dimension ... that the map has been changed. ... The brain has a finite and relatively fixed number of neurons, ... But in fact, before we learned how to ride a bike, ...
    (comp.ai.philosophy)
  • Re: No change engine maps between qualifying and the race.
    ... During the race, same thing all channels allowed are taken ... it is key to a lot of this to know how many maps the ECU can hold. ... Don't forget, the ECU runs the engine code, the map is just the data it uses ... think the term "changing the mapping" has been inaccurate. ...
    (rec.autos.sport.f1)