Pun打算……让我们讨论Java final
。
最近,我们广受欢迎的博客文章“编码Java时的十个微妙的最佳实践”在JavaWorld的摘要和链接中有了很大的复兴,并提出了一组新的评论。 尤其是,JavaWorld编辑对我们对Java关键字“ final
”的观点提出了质疑:
更有争议的是,Eder提出了默认情况下使方法最终化是否安全的问题:
“如果您完全控制所有源代码,则默认情况下将方法定为final绝对没有问题,因为:”
- “如果确实需要重写方法(真的吗?),您仍然可以删除final关键字”
- “您再也不会意外覆盖任何方法了”
确实是的。 默认情况下,所有类,方法,字段和局部变量都应为final,并且可以通过关键字进行更改。
以下是字段和局部变量:
int finalInt = 1;
val int finalInt = 2;
var int mutableInt = 3;
是否确实需要使用Scala / C#样式的val
关键字仍有待商.。 但是很显然,为了再次修改字段/变量,我们应该有一个明确允许它的关键字。 方法相同–我使用Java 8的default
关键字来提高一致性和规则性:
class FinalClass {void finalMethod() {}
}default class ExtendableClass {void finalMethod () {}default void overridableMethod() {}
}
在我们看来,那将是一个完美的世界,但是Java却采取了另一种方式,将default
(可覆盖,可变)默认和final
(不可覆盖,不可变)显式选项。
公平地说,我们会忍受的
…作为API设计人员(当然来自jOOQ API),我们会很乐意将final
放在final
,至少假装Java具有上述更明智的默认值。
但是许多人不同意这种评估,主要原因是:
作为主要在osgi环境中工作的人,我不能完全同意,但是您可以保证其他api设计人员也有同样的感觉吗? 我认为最好是先限制api设计人员的错误,而不是先限制用户可以默认扩展的范围,以取代用户的错误。 – eliasv在reddit上
要么…
强烈反对。 我宁愿从公共图书馆禁止final和private。 当我真的需要扩展某些东西而无法完成时,这是一种痛苦。
故意锁定代码可能意味着两件事,要么糟透了,要么完美。 但是,如果它是完美的,那么没有人需要对其进行扩展,那么为什么要关心它。
当然,存在使用final的正当理由,但是担心用新版本的库破坏某人并不是其中之一。 – 在reddit上的meotau
还是...
我知道我们已经对此进行了非常有用的讨论,但只是在此线程上提醒其他人:关于“最终”的许多争论都取决于上下文:这是公共API还是内部代码? 在前一种情况下,我同意有一些很好的论据可以说是最终的。 在后一种情况下,最终几乎总是一个糟糕的主意。 – Charles Roth在我们的博客上
所有这些论点都倾向于朝一个方向发展:“我们正在开发糟糕的代码,因此我们至少需要一些解决方法来减轻这种痛苦。”
但是为什么不这样想呢:
以上所有人员都想到的API设计人员将精确创建您想通过扩展进行修补的可怕API。 碰巧的是,除非Java语言要求,否则相同的API设计人员不会考虑关键字final
的有用性和可通信性,因此永远不会使用它。 双赢(尽管糟糕的API,不稳定的解决方法和补丁程序)。
希望将final用于其API的API设计人员将在如何正确设计API(以及定义明确的扩展点/ SPI)方面反映出很多内容,从而使您永远不必担心final
是什么。 同样,双赢(和一个很棒的API)。
此外,在后一种情况下,奇怪的黑客将不会被黑客入侵和破坏您的API,而这只会导致痛苦和痛苦,但这并不是真正的损失。
最终界面方法
由于上述原因,我仍然深感遗憾,Java 8接口中的final
是不可能的。 布莱恩·格茨(Brian Goetz)做出了出色的解释,为什么如此决定。 实际上,是通常的解释。 关于这一点不是改变的主要设计目标!
但是,如果我们有以下条件,请考虑语言的一致性和规律性:
default interface ImplementableInterface {void abstractMethod () ;void finalMethod () {}default void overridableMethod() {}
}
(鸭子和奔跑…)
或者,更现实地说,我们的默认值为default
:
interface ImplementableInterface {void abstractMethod () ;final void finalMethod () {}void overridableMethod() {}
}
最后
那么,您对此讨论的最终想法是什么?
如果您还没听够,请考虑同时阅读 Whiley编程语言作者David Pearce博士的 这篇出色文章 。
翻译自: https://www.javacodegeeks.com/2014/09/this-is-the-final-discussion.html