2013-11-03 79 views
2

最近我在this問題中感到沮喪,在這個問題中,OP想要根據被格式化的數字的特徵來改變輸出的格式。爲什麼這麼多的Java庫會在`CharSequence`中做'String`?

的自然機制將是動態構造的格式,但由於PrintStream.format需要String而不是CharSequence的建設必須在String施工結束。

建立一個實施CharSequence的課程本來是非常自然和高效的,它提供動態格式而不需要另外創建另一個String

這似乎是Java庫中的一個常見主題,默認情況下,即使不可變性不是必需條件,它也需要String。我知道Map s和Set s中的密鑰通常應該是不可變的,原因很明顯,但據我所見,String通常用於CharSequence就足夠了。

+0

而要回答的問題是?這似乎是一個應該針對開發者的問題。 – Patrick

+0

@帕特里克 - 有沒有很好的理由使用'String'以至於我錯過了? – OldCurmudgeon

+0

@since項目告訴你所有你需要回答這個問題。 – EJP

回答

2

有幾個原因。

  • 在很多情況下,不變性是功能性需求。例如,您已經確定,如果某個元素或關鍵字發生了變異,那麼很多集合/集合類型將「中斷」。

  • 在很多情況下,不變性是安全性要求。例如,在沙箱中運行不可信代碼的環境中,任何不可信代碼都可能將StringBuilder而不是String傳遞到可信代碼的情況是潛在的安全問題。

  • 在很多情況下,原因是向後兼容。在Java 1.4中引入了CharSequence接口。早於Java 1.4的Java API不使用它。此外,更改使用String以使用CharSequence的先前存在的方法存在二元兼容性問題的風險;即它可以防止舊Java代碼在較新的JVM上運行。

  • 其餘的可能只是 - 「工作太多,時間太少」。對現有的標準API進行修改需要付出很大的努力來確保所有人都能接受這一改變(例如,檢查上述內容),並且讓每個人都相信它一切正常。工作必須優先考慮。

所以,當你發現這令人沮喪,這是不可避免的。


1 - 這將使Java API的設計了一個困難的選擇。他/她是否編寫API來創建(昂貴的)防禦性副本,只要它傳遞了一個可變的「字符串」,並且可能會改變API的語義(從用戶的角度來看!)。或者他/她將API標記爲「對不可信代碼不安全」...並希望開發人員注意/理解?

當然,當您根據自己的理由設計自己的API時,您可以打電話說安全性不是問題。 Java API設計者不在那個位置。他們需要設計適用於每個人的API。使用String是最簡單/風險最小的解決方案。

1

http://docs.oracle.com/javase/6/docs/api/java/lang/CharSequence.html

你注意到解釋說,既然1.4,它已經有一部分?以前使用的所有API方法String(自1.0年以來一直在使用)

+0

但是'CharSequence'可用後''PrintStream.format(字符串格式,對象...參數)'在1.5秒之後被添加 - 但仍然選擇了'String'。我錯過了什麼? – OldCurmudgeon

+0

沒有必要重新實現對字符串的迭代?請注意,通過'CharSequence'方法,你可以這麼做,或者調用'toString()' – SJuan76

+0

在「CharSequence」中迭代與在String中迭代完全相同 - 或者我錯過了什麼? – OldCurmudgeon

相關問題