package Ġcom . ten ext . demo čĊč Ċ /** čĊ Ġ* Ġæķ°æį® æī§ æľī èĢħ čĊ Ġ*/ č Ċ class ĠData Holder Ġprivate Ġconstructor () Ġ{ čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠData . holder čĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġobject ĠData Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġholder Ġ= ĠData Holder () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġæķ°æį® åĪĹè¡¨ čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġval Ġdata Map Ġ= ĠHashMap < String , ĠAny >() čĊčĊĠĠĠ Ġprivate Ġval Ġrole List Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠ Ġhash Set Of < Data Role >() čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġ æ³¨åĨĮ ç®¡çĲĨ èĢħ čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġregister ( any : ĠAny ): ĠData Role Ġ{ čĊĠĠĠĠĠĠĠ Ġcontains ( any )?. run Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġrole Ġ= ĠData Role ( this , Ġany ) čĊĠĠĠĠĠĠĠ Ġrole List . add ( role ) čĊĠĠĠĠĠĠĠ Ġreturn Ġrole čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġ åıį æ³¨åĨĮ ç®¡çĲĨ èĢħ čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġunregister ( any : ĠAny ) Ġ{ čĊĠĠĠĠĠĠĠ Ġcontains ( any )?. run Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . clear () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġrole List . remove ( this ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġcontains ( any : ĠAny ): ĠData Role ? Ġ{ čĊĠĠĠĠĠĠĠ Ġrun Ġout @{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġrole List . forEach Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . owner Ġ== Ġany ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġnull čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġ åŃĺ æĶ¾ æķ°æį® čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġput ( key : ĠString , Ġany : ĠAny ) Ġ{ čĊĠĠĠĠĠĠĠ Ġdata Map [ key ] Ġ= Ġany čĊĠĠĠĠĠĠĠ Ġdata Map . remove ( key ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġ èİ·å¾Ĺ æķ°æį® čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġ< T > Ġget ( key : ĠString ): ĠT ? Ġ{ čĊĠĠĠĠĠĠĠ Ġ( data Map [ key ] Ġas ? ĠT )?. run Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġnull čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġ ç§»éĻ¤ key čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġremove ( key : ĠString ) Ġ{ čĊĠĠĠĠĠĠĠ Ġdata Map . remove ( key ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġæ¸ ħ éĻ¤ æķ°æį® čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġclear () Ġ{ čĊĠĠĠĠĠĠĠ Ġdata Map . clear () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġclass ĠData Role ( holder : ĠData Holder , Ġany : ĠAny ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġany čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġholder Ġ= Ġholder čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġkey List Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of < String >() čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* Ġ åŃĺ æĶ¾ æķ°æį® čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġfun Ġput ( key : ĠString , Ġany : ĠAny ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! key List . contains ( key )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey List . add ( key ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . data Map [ key ] Ġ= Ġany čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* ĠæĽ´æĸ° æķ°æį® ï¼Į ä¸įåŃĺåľ¨ çļĦ key æĹłæ³ķ æĽ´æĸ° čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġfun Ġupdate ( key : ĠString , Ġany : ĠAny ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder . data Map . containsKey ( key )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . data Map [ key ] Ġ= Ġany čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* Ġ èİ·å¾Ĺ æķ°æį® čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġget ( key : ĠString ): ĠT ? Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( holder . data Map [ key ] Ġas ? ĠT )?. run Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* Ġ ç§»éĻ¤ key čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġfun Ġremove ( key : ĠString ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey List . remove ( key ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . data Map . remove ( key ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* Ġæ¸ ħ éĻ¤ æķ°æį® čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġfun Ġclear () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey List . forEach Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . data Map . remove ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey List . clear () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* Ġ æĶ¾ å¼ĥ æŁĲä¸ª åŃĹæ®µ çļĦ ç®¡çĲĨ æĿĥ čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġfun Ġgive Up ( key : ĠString ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key List . contains ( key )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey List . remove ( key ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* Ġèİ·åıĸ æŁĲä¸ª åŃĹæ®µ çļĦ ç®¡çĲĨ æĿĥ čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġfun Ġpick Up ( key : ĠString ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey List . add ( key ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠ Ġ} čĊč Ċ } čĊ