本文介紹了有沒有可能擴展標記為最終的Joda-Time類?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我真的很喜歡Joda-Time,但我遇到了一些我認為有問題的事情。我想擴展一些類,特別是DateTime、LocalDate和LocalDateTime。但它們被標記為”最終版本”。
我發現了一個非常古老的線程,它被解釋為確保類保持不變的一種方式。http://osdir.com/ml/java-joda-time-user/2006-06/msg00001.html
我還在這里找到了一個線索,因此,是否需要將Java類標記為最終類以確保不變性是有爭議的。Why would one declare an immutable class final in Java?
無論如何,我發現不能擴展這些類是一個很大的限制。除了下載和修改源文件之外,還有什么可以做的來創建這些類的擴展版本嗎?
編輯-討論:
擴展類的能力是面向對象編程中最強大和最有用的概念之一。這可以始終有用。類的作者不可能100%確定他/她的超級Duper類在擴展到涵蓋無人能預見的用例時對某些程序員不會更有用。
Joda-Time類被標記為”最終”的明顯原因是為了確保不可能有人創建一個可變的擴展類,并將其用于依賴于Joda-Time對象不可變的現有程序。因此,在某種程度上,將這些類標記為”最終”是因為缺少一種允許將類標記為”不可變”的Java語言機制,因此它們可以被擴展,但前提是擴展的類也被標記為”不可變”。
因此,鑒于Java中缺少”不可變”關鍵字,我可以理解Joda-Time的作者希望避免這種情況。
以下解決方案可行嗎?例如,我們可以有一個結構,其中LocalDate派生自LocalDateNonFinal嗎?LocalDate是一個標記為”Final”的空類。所有功能都在LocalDateNonFinal中。
因此,如果您確實想要擴展LocalDate類,并且只打算在您自己的程序中使用擴展類,那么您可以擴展LocalDateNonFinal,并將其命名為MyLocalDate。這不會將其他模塊暴露給您可能的錯誤,因為它們仍將需要LocalDate,并且不接受LocalDateNonFinal或您的MyLocalDate。
這可以與試圖教育想要擴展這些類的程序員相結合,警告他們如果意外地創建了一個可變版本并仍然將其視為不可變的版本,則可能會出現問題。并指出這些擴展類將不能與期望常規(“最終”)類的其他模塊一起使用。
PS。我會在幾天后發布我的變通解決方案,當我完全確定的時候。到目前為止,我已經對其中兩個答案投了贊成票–謝謝你的評論和建議。我目前傾向于按照德米特里·扎伊采夫(Dmitry Zaitsev)的建議采用包裝式解決方案。
推薦答案
您可以將最終類包裝到您自己的類中,提供您想要的任何操作,并提供將返回原始Joda-Time對象的”view”方法。就像這樣:
public class MyJodaExtension {
private final DateTime dateTime;
public MyJodaExtension(DateTime dateTime) {
this.dateTime = dateTime;
}
public boolean myOperation() {
return false; // or whatever you need
}
public DateTime asDateTime() {
return dateTime;
}
}
使用這種方法,您甚至可以使MyJodaExtension
變,并根據需要提供DateTime
的不同實例(但我希望您不要這樣做,不變的類很棒)。
正如Nathan Hughes所說,您不可能將這種”繼承的”類傳遞給其他庫或任何需要原始Joda Time類的代碼。
這篇關于有沒有可能擴展標記為最終的Joda-Time類?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,