Publish & Escape
我們把某個internal state / object 提供介面讓外面的程式存取的話,就稱為publish。如果此object在我們不允許的時候被publish了,稱為escape!
最爛的publish
就是static object@@~~~ 其實蠻多時候迫不得已要用啊?!
爛的原因在於:
(1)由於是static,thread-safety是個issue
(2)object本身雖然刻意被publish,但是不想被publish的相關物件可能也被publish了。例如此object所包含的data有可能通過public interface被存取,這同樣也有了thread safety的issue。
其次爛的publish: publish internal mutable variables
應該是要給setter,而不是直接給object reference,這樣很危險:小心constructor ESCAPE
通常是在constructor,我們會init某些data member,給予某個anonymous listener當作參數丟入,不過這邊就是一個escape ! 因為首先 這個inner class instance是有一個hidden的"this" reference到外面的這個object instance,所以洩露了!另一個危險是,故意去用這個escape instance的人也會陷入危險,因為ThisEscape object還沒有完成construction就洩露了object reference,很多state不一定會符合spec規定。
另外,別從constructor啟動另一個timer或是thread! 理由同上。建議把啟動thread的動作放到constructor之外,就不會有上述的問題。
沒有留言:
張貼留言