sun.reflect.generics.reflectiveObjects.NotImplementedException 和 org.apache.commons.lang3.NotImplementedException 有什么区别

What is the difference between sun.reflect.generics.reflectiveObjects.NotImplementedException and org.apache.commons.lang3.NotImplementedException

我发现有 2 个 NotImplementedException:

由于第一个没有可用的文档,我无法理解它们之间的区别。 这是什么区别?其中一个比另一个好吗?

我可以这样回答。有什么区别 com.your.package.NotImplementedExceptionorg.apache.commons.lang3.NotImplementedException?

sun.reflect.generics.reflectiveObjects.NotImplementedExceptionJDK 内部 API,不能在用户代码中使用。

这很简单:任何东西 存在于以 sun... 开头的包中的东西(几乎总是)可以安全地忽略(有一些罕见的例外,例如 sun.misc.Unsafe)

换句话说:这些仍随 JDK/JRE 一起提供的软件包 而非 用于 public 用法。即使他们提供了一些 有用的东西 - 你最好寻找 "really public" 替代品。这样 类 的主要目的是帮助实现 JVM 的 "internals"。它们完全不受您的控制,并且几乎没有 "guarantees" 随着时间的推移它们会发生什么。

从这个意义上说,答案是:sun 例外是您根本不应该使用的例外;而 apache commons one 可能 是一个不错的选择。整个公地 类 要使用 "publicly".

I have discovered there are 2 NotImplementedException

我找到了比这更多的例子。这取决于你看起来有多努力......以及在哪里。


Since there is not an available documentation for the first one ...

那是因为 sun.reflect.generics.reflectiveObjects.NotImplementedException 内部 class。源代码说:

"Temporary class used to indicate missing functionality"


What is this difference?

它们或多或少表示相同的意思。某些功能尚未实现。


Is one of them better than the other one?

我假设你真的在问你是否可以并且应该在你的代码中重用这些异常中的任何一个。

  1. 由于 sun.reflect... 异常是一个内部 class(参见@GhostCat 的回答),不建议 在你的代码。在 Java1 的未来版本中,class 有可能会 "go away"。这会给您的代码库带来问题。

  2. 重用org.apache.commons...异常是合理的。事实上,根据我对 javadoc 的阅读,设计 通常 可重用。然而:

    • 不标准。
    • 事实上,这个class至少有两个版本,在org.apache.commons.langorg.apache.commons.lang3。 (参见项目符号 #1!)
    • 您将(可能)添加对 Apache Commons 的新依赖。这可能会增加您的维护成本;例如如果有人在 Apache Commons 中发现需要修补的安全问题。此外,如果您的公司有反开源管理人员或律师……让他们对公司 "no opensource" 政策授予例外的努力可能太多了。
  3. 其他选择是声明您自己的自定义异常,或者简单地使用现有的 java.lang.UnsupportedOperationException ... 标准,不会 添加新的依赖项,并且 不会 在将来的 Java 版本中删除。


1.我不确定这一点,但我认为 Java 9.

中已阻止对 sun.reflect.generics.reflectiveObjects 的访问