Java中的StringBuilder
和StringBuffer
之間的差異已有詳細記錄,並且也是touched upon in StackOverflow。爲什麼不讓StringBuilder和StringBuffer實現一個通用接口?
基本上,StringBuilder
是StringBuffer
的非同步副本,它具有幾乎相同的接口,因爲它旨在作爲StringBuffer
的更快捷的替代替代方案。他們的API實際上是相同的,他們實際上是在當前JDK中抽象類相同的不可訪問的的子類。
我想知道的一件事就是爲什麼他們不是公開相關。讓這兩個類實現一個通用接口,或者甚至將StringBuffer
作爲StringBuilder
的子類是合理的,從而允許兩個類都存在共享代碼。
那麼爲什麼這個強制分離呢?這是否讓程序員不會無意中將線程安全和線程不安全的代碼混合在一起?還是僅僅是一種設計監督,現在會被遺傳到永恆的盡頭?
編輯:
爲了把事情說清楚:我可以爲什麼事情都是這樣猜測,但我希望能具體引用到實際的決策,例如在JSR過程中。任何能夠說明對我而言是什麼的情況都會偶爾造成一定的困難。
編輯2:
兩個類都實現Appendable
事實完全忘了。可能是因爲該特定界面在大多數情況下都沒有用處 - 它只能追加一個字符或一個準備好的對象,就是這樣。在大多數情況下,這兩個類都不是Object
的子類。
編輯3:
嗯,這裏是正是這個問題從a semi-official source的理由:由圖書館團隊
評價:
它是由設計的StringBuffer和StringBuilder的沒有共同的 公共超類型。他們不打算成爲替代品:一個是 錯誤(StringBuffer),另一個(StringBuilder)是其替代品 。
很明顯,在某些情況下,缺少常見的超類型會減緩從StringBuffer到StringBuilder的希望遷移。另一方面 就是通過添加一個常見的超類型,我們會將過去的錯誤記錄下來,並將它們放入一個公共接口中,以便與我們聯繫所有的 時間。這不僅會減緩遷移速度,而且會導致遷移。
有一些方法,例如附加(長)在兩個類中,但沒有接口。 – 2012-03-19 03:45:37
雖然我想像Vector和ArrayList擴展AbstractList,但StringBuffer和StringBuilder可以擴展一個類似的抽象類。我沒有看到最新的源代碼,但StringBuilder似乎是一個直接的StringBuffer減去同步。 – 2012-03-19 03:48:27
@MatthewFlaschen append()來自Appendable。 – 2012-03-19 03:49:42