Java BlockingQueue domanda di design
-
09-10-2019 - |
Domanda
il metodo java.util.concurrent.BlockingQueue.add (E e) 's JavaDoc si legge:
boolean add (E e)
Inserisce l'elemento specificato in questa coda se è possibile farlo immediatamente senza violare capacità restrizioni, restituendo vero su successo e un lancio IllegalStateException se non c'è spazio attualmente disponibile. Quando si utilizza un capacità limitata di coda, è generalmente preferibile utilizzare l'offerta.
La mia domanda è: sarà mai tornare falso? in caso contrario, perché questo metodo di restituire un valore booleano? Sembra strano per me. Qual è la decisione di design dietro questo?
Grazie per la vostra conoscenza!
Manuel
Soluzione
Segue il contratto di Collection.add(E e)
(dal momento che è un BlockingQueue
sottotipo di Collection
):
Se una raccolta rifiuta di aggiungere un particolare elemento per qualsiasi motivo diverso da quello che già contiene l'elemento, deve lanciare un eccezione (piuttosto che ritornare false). Questo conserva l'invariante che una collezione contiene sempre il elemento specificato dopo questa chiamata ritorni.
Altri suggerimenti
Il dietro la decisione è: sicuro veloce. L'IllegalStateException sarà gettato, se la coda ha una capacità limitata. IllegalStateException è un RuntimeException. Quindi, se l'eccezione si butta, probabilmente avete un difetto nella logica dell'applicazione o la logica dell'applicazione non è abbastanza sulla difensiva. O, per dirla in altre parole:. Se si desidera utilizzare una coda limitata, l'applicazione deve affrontare in modo corretto (uso offer
invece)
Sto indovinando che ha un tipo di ritorno booleano perché è una sottointerfaccia di Queue
, che ha anche un metodo boolean add(E obj)
(che a sua volta deriva da Collection
). Alcune implementazioni Queue
respingono i tentativi di aggiungere oggetti alla coda restituendo falsa.
Quindi, la risposta alla tua domanda è che le implementazioni di BlockingQueue non torneranno mai falso.
Il metodo restituisce un valore booleano perché le sostituzioni Collection#add(E e)
.