question de conception Java BlockingQueue
-
09-10-2019 - |
Question
java.util.concurrent.BlockingQueue.add le procédé (E e) «lit de la JavaDoc:
add booléenne (E e)
Inserts l'élément spécifié dans cette file d'attente s'il est possible de le faire immédiatement, sans violer la capacité restrictions, renvoyant true sur succès et lancer une IllegalStateException si aucun espace actuellement disponible. Lorsque vous utilisez un file d'attente capacité restreinte, il est généralement préférable d'utiliser l'offre.
Ma question est: faut-il revenir toujours faux? sinon, pourquoi cette méthode renvoie un booléen? Il semble bizarre pour moi. Quelle est la décision de conception derrière tout cela?
Merci pour vos connaissances!
Manuel
La solution
Il fait suite au contrat de Collection.add(E e)
(depuis BlockingQueue
est Sous-type de Collection
):
Si une collection refuse d'ajouter une élément particulier pour une raison quelconque, autre que celle-ci contient déjà l'élément, il doit lancer une exception (au lieu de retourner faux). Cela préserve l'invariant qu'une collection contient toujours élément spécifié après cet appel retours.
Autres conseils
Le derrière de décision: échec rapide. Le IllegalStateException sera lancé, si la file d'attente a une capacité limitée. IllegalStateException est un RuntimeException. Donc, si l'exception est jeté, vous avez probablement un défaut dans la logique de votre application ou votre logique d'application ne suffit pas défensive. Ou pour le dire autrement dit:. Si vous souhaitez utiliser une file d'attente limitée, votre application doit traiter correctement (utilisation offer
à la place)
Je devine qu'il a un type booléen de retour, car il est une sous-interface de Queue
, qui a également une méthode boolean add(E obj)
(qui à son tour est dérivé de Collection
). Certaines implémentations de Queue
rejettera les demandes d'ajouter des objets à la file d'attente en retournant faux.
Ainsi, la réponse à votre question est que les implémentations de BlockingQueue ne reviendront faux.
La méthode renvoie un booléen, car il remplace Collection#add(E e)
.