【发布时间】:2015-03-11 23:11:25
【问题描述】:
我真的很喜欢 Joda-Time,但我遇到了一些我认为是问题的事情。我想扩展一些类,特别是 DateTime、LocalDate 和 LocalDateTime。但它们被标记为“最终”。
我发现了一个非常古老的线程,它被解释为确保类保持不可变的一种方法。 http://osdir.com/ml/java-joda-time-user/2006-06/msg00001.html
我还在 SO 上找到了一个线程,其中需要将 Java 类标记为 final 以确保不变性存在争议。 Why would one declare an immutable class final in Java?
无论如何,我发现无法扩展这些类是一个主要限制。除了下载源文件并修改它们之外,还有什么办法可以创建这些类的扩展版本?
编辑 - 讨论:
扩展类的能力是面向对象编程中最强大和最有用的概念之一。这总是很有用。一个类的作者不可能 100% 确定他/她的超级骗子类在扩展到涵盖无人能预见的用例时不会对某些程序员更有用。
Joda-Time 类被标记为“final”的明显原因是确保某人不可能创建一个可变的扩展类,并将其与依赖于 Joda-Time 的现有程序一起使用对象是不可变的。所以在某种程度上将这些类标记为“最终”是由于缺乏允许类被标记为“不可变”的Java语言机制,因此它们可以被扩展,但前提是扩展的类也被标记为“不可变” ”。
所以鉴于 Java 中缺少“不可变”关键字,我可以理解 Joda-Time 的作者想要避免这种情况。
以下解决方案是否可行?我们能否有一个结构,例如,LocalDate 是从 LocalDateNonFinal 派生的? LocalDate 是一个标记为“final”的空类。所有功能都在 LocalDateNonFinal 中。
所以如果你真的想扩展 LocalDate 类,并且只打算在你自己的程序中使用扩展类,那么你可以改为扩展 LocalDateNonFinal,并将其命名为 MyLocalDate。这不会将其他模块暴露给您可能的错误,因为它们仍然需要 LocalDate,并且不会接受 LocalDateNonFinal 或您的 MyLocalDate。
这可以与尝试教育想要扩展这些类的程序员相结合,警告他们如果他们不小心创建了一个可变版本并且仍然将其视为不可变的可能出现的问题。并指出这些扩展类将无法与其他需要常规(“最终”)类的模块一起使用。
PS。当我完全确定时,我会在几天后发布我的解决方案。到目前为止,我已经对两个答案投了赞成票 - 感谢您的 cmets 和建议。我目前倾向于采用 Dmitry Zaitsev 建议的类似包装器的解决方案。
【问题讨论】:
-
您可以使用
composite设计模式来扩展功能,但类将是不同的类型。 -
如果您想扩展 DateTime 之类的类,我怀疑存在设计问题...
-
您真正想解决什么问题?这闻起来像是 XY 问题。
-
@Mr.Polywhirl:我看不出我的问题与询问“final”关键字对 Java 类意味着什么的问题重复。我的问题意味着我确实对“最终”的含义有所了解。我只是想知道如何扩展或实际扩展某些恰好被标记为 final 的 Joda-Time 类。