package Ġcom . bad oo . reak t ive . dis posable Ċ Ċ import Ġcom . bad oo . reak t ive . utils . lock . new Lock Ċ import Ġcom . bad oo . reak t ive . utils . lock . synchronized Ċ Ċ /** Ċ Ġ* ĠThread - safe Ġcollection Ġof Ġ[ Disposable ] Ċ Ġ*/ Ċ class ĠComposite Disposable Ġ: ĠDis posable Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlock Ġ= Ġnew Lock () ĊĠĠĠ Ġprivate Ġvar Ġset : ĠMutable Set < Disposable >? Ġ= Ġhash Set Of () ĊĠĠĠ Ġoverride Ġval Ġis Disposed : ĠBoolean Ġget () Ġ= Ġlock . synchronized Ġ{ Ġset Ġ== Ġnull Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdis pos ables To Dispose : ĠSet < Disposable >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( set Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . synchronized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables To Dispose Ġ= Ġset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdis pos ables To Dispose ?. forEach ( Disposable :: dispose ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAtom ically Ġeither Ġadds Ġthe Ġspecified Ġ[ Disposable ] Ġor Ġdis poses Ġit Ġif Ġcontainer Ġis Ġalready Ġdisposed . ĊĠĠĠĠ Ġ* ĠAlso Ġremoves Ġalready Ġdisposed ĠDis pos ables . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd ( dis posable : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( set Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . synchronized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . removeAll ( Disposable :: is Disposed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add ( dis posable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdis posable . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ add ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( dis posable : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( dis posable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAtom ically Ġremoves Ġthe Ġspecified Ġ[ Disposable ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdis posable Ġthe Ġ[ Disposable ] Ġto Ġbe Ġremoved ĊĠĠĠĠ Ġ* Ġ@ param Ġdispose Ġif Ġtrue Ġthen Ġthe Ġ[ Disposable ] Ġwill Ġbe Ġdisposed Ġif Ġremoved , Ġdefault Ġvalue Ġis Ġtrue ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġspecified Ġ[ Disposable ] Ġwas Ġremoved Ġ( and Ġdisposed ), Ġfalse Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove ( dis posable : ĠDis posable , Ġdispose : ĠBoolean Ġ= Ġtrue ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġis Removed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( set Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . synchronized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( set ?. remove ( dis posable ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Removed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Removed Ġ&& Ġdispose ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis posable . dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġis Removed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ remove ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġminus Assign ( dis posable : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove ( dis posable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAtom ically Ġclears Ġall Ġthe Ġ[ Disposable ] s ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdispose Ġif Ġtrue Ġthen Ġremoved Ġ[ Disposable ] s Ġwill Ġbe Ġdisposed , Ġdefault Ġvalue Ġis Ġtrue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear ( dispose : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( set Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. synchronized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ= Ġhash Set Of () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġdispose Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . forEach ( Disposable :: dispose ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }