Ist es sicher zu still fangen, wenn Classcast für einen bestimmten Wert gesucht?
-
10-10-2019 - |
Frage
Angenommen, ich bin eine sortierte Sammlung Umsetzung - Betrachten Sie diese (unvollständige) Umsetzung (einfaches Beispiel ein Set
basierend auf einem sortierten Array.):
import java.util.*;
public class SortedArraySet<E> extends AbstractSet<E> {
@SuppressWarnings("unchecked")
public SortedArraySet(Collection<E> source, Comparator<E> comparator) {
this.comparator = (Comparator<Object>) comparator;
this.array = source.toArray();
Arrays.sort(this.array, this.comparator);
}
@Override
public boolean contains(Object key) {
return Arrays.binarySearch(array, key, comparator) >= 0;
}
private final Object[] array;
private final Comparator<Object> comparator;
}
Nun wollen wir schaffen eine Menge ganzer Zahlen
Set<Integer> s = new SortedArraySet<Integer>(Arrays.asList(1, 2, 3), null);
Und Test, ob es einige spezifische Werte enthält:
System.out.println(s.contains(2));
System.out.println(s.contains(42));
System.out.println(s.contains("42"));
In der dritten Zeile über eine ClassCastException
werfen. Nicht das, was ich will. Ich würde es vorziehen, es false
zurückzukehren (wie HashSet
der Fall ist.)
Ich kann dieses Verhalten erhalten, indem die Ausnahme abfangen und Rückkehr false:
@Override
public boolean contains(Object key) {
try {
return Arrays.binarySearch(array, key, comparator) >= 0;
} catch (ClassCastException e) {
return false;
}
}
die source
Sammlung Unter der Annahme ist richtig getippt , was schief gehen könnte, wenn ich dies tun?
Lösung
Ich glaube nicht, dass es irgendein Problem mit diesem als Javadoc für Collection.contains
eindeutig fest, dass ein ClassCastException
is werfen optional.
Die einzige Problem ich sehe, ist, dass, wenn Sie einen Fehler haben irgendwo keine Ausnahme werfen werden Sie verhindern, dass es genau zu bestimmen.
Andere Tipps
Die TreeSet
Klasse hat eine ClassCastException
für unvereinbar Argumente contains()
werfen (unvereinbar für die Comparator
durch den Satz verwendet wird). Also es ist nichts falsch mit, dass die Ausnahme zu werfen. So stellen Sie sicher, dass Sie dokumentieren, dass dies passieren kann.
Es ist vollkommen legitim einen CCE Wurf lassen von () enthält. viele Sammlung Implementierungen fangen jedoch, dass und Rückkehr falsch, die ich als auch vollkommen legitim zu sein, und in der Tat ist das benutzerfreundliches Verhalten.
In equals () Sie nicht die Wahl haben; Sie müssen diese CCE fangen.
eine ungeprüfte Ausnahme Fangen sollte immer schmutzig fühlen, aber manchmal ist es das Richtige zu tun.