为什么java.net.URL最终?

时间:2012-09-12 15:51:28

标签: java

我想继承java.net.URL,但我不能,因为它是最终的。我收到错误:

cannot inherit from final java.net.URL

为什么是最终的?

为什么String is final说明JVM依赖于String的问题的一些答案,因为它是一种非常基本的数据类型。我无法看到这将如何应用于URL类型。

更新

许多答案和评论都说明了原因,为什么避免继承是一种好习惯。有些人甚至认为一切都应该是最终的。但现实是不同的。 JDK中的大多数类都是而不是 final。良好的做法是一个应该不从java.net.URL继承的原因。这甚至可能适用于JDK的任何类。但是当某些内容被定义为最终内容时,可以不能继承。这仅适用于极少数类,如String或URL。

因此,URL和所有其他非最终类之间必定存在不同之处。问题是:这是什么区别,这使得必要的URL是最终的?

说我不应该关心这个问题,因为我不应该继承这个问题。

3 个答案:

答案 0 :(得分:6)

这是最后一个特别是阻止你扩展它。 However it works internally,它不是为继承而设计的,所以作者阻止你这样做。

记住 Effective Java:

  • 第17项:“继承的设计和文档,或者禁止它。”
  • 第16项:“赞成合成而不是继承。”

因此,不是扩展URL,而是创建一个具有URL字段的类。

答案 1 :(得分:2)

我猜这是出于安全原因。如果方法需要URL对象作为参数,并且您可以扩展URL类以执行URL类不应该执行的操作,那么它可能存在安全问题。

答案 2 :(得分:0)

AFAIK URL是IETF RFC标准的完整实现,因此不希望您想要更改或扩展它。