Java Blocking Design Frage
-
09-10-2019 - |
Frage
Das Verfahren java.util.concurrent.BlockingQueue.add (E e) 's JavaDoc lautet:
boolean add (E e)
Fügt das angegebene Element in diese Warteschlange, wenn es möglich ist, dies zu tun sofort, ohne Kapazität zu verletzen Einschränkungen gibt true zurück auf Erfolg und wirft ein Illegal wenn kein Platz mehr ist derzeit verfügbar. Bei Verwendung eines Kapazitäts beschränkt Warteschlange, es ist im allgemeinen bevorzugt Angebot zu nutzen.
Meine Frage ist: wird es immer false zurück? wenn nicht, warum nicht zurückgibt diese Methode einen boolean? Es scheint seltsam für mich. Was ist die Design-Entscheidung dahinter?
Danke für Ihr Wissen!
Manuel
Lösung
Es folgt den Vertrag von Collection.add(E e)
(seit BlockingQueue
a Subtyp von Collection
):
Wenn eine Sammlung verweigert ein hinzufügen bestimmte Element aus irgendeinem Grunde außer, dass es bereits enthält das Element, muss sie werfen ein Ausnahme (eher als Rückkehr falsch). Dies bewahrt die invariant dass eine Sammlung enthält immer die gebenes Element nach diesem Aufruf kehrt zurück.
Andere Tipps
Die Entscheidung, hinter ist: schnell scheitern. Die Illegal wird geworfen, wenn die Warteschlange eine begrenzte Kapazität hat. Illegal ist ein Runtime. Also, wenn die Ausnahme ausgelöst wird, haben Sie wahrscheinlich einen Fehler in der Anwendungslogik oder Ihre Anwendungslogik ist nicht defensiv genug. Oder sagen, dass es mit anderen Worten:. Wenn Sie eine begrenzte Warteschlange verwenden möchten, sollten Sie Ihre Anwendung damit umgehen richtig (Verwendung offer
statt)
Ich vermute, es einen boolean Rückgabetyp hat, weil es ein Subschnittstelle von Queue
ist, die auch eine boolean add(E obj)
Methode hat (die wiederum aus Collection
abgeleitet). Bestimmte Implementierungen Queue
lehnen Versuche auf Objekte zu der Warteschlange hinzufügen, indem falsch zurück.
So die Antwort auf Ihre Frage ist, dass Implementierungen von Blocking nie falsch zurück.
Die Methode gibt einen boolean, weil es überschreibt Collection#add(E e)
.