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?

War es hilfreich?

Lösung

Ich glaube nicht, dass es irgendein Problem mit diesem als Javadoc für Collection.contains eindeutig fest, dass ein ClassCastExceptionis 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top