2

我发现有 2 个 NotImplementedException:

  • sun.reflect.generics.reflectiveObjects.NotImplementedException
  • org.apache.commons.lang3.NotImplementedException

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

4

3 回答 3

8

我发现有2个NotImplementedException

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


由于第一个没有可用的文档...

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

“用于指示缺少功能的临时类”


这有什么区别?

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


其中一个比另一个更好吗?

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

  1. 由于sun.reflect...异常是一个内部类(请参阅@GhostCat 的答案),因此建议在您的代码中使用它。该类有可能在 Java 1的未来版本中“消失” 。这会给您的代码库带来问题。

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

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


1. 我不确定这一点,但我认为sun.reflect.generics.reflectiveObjectsJava 9 中阻止了访问。

于 2018-01-24T09:47:17.800 回答
2

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

换句话说:这些仍然随 JDK/JRE 一起提供的包并不打算供公众使用。即使它们提供了一些有用的东西——你最好寻找“真正公开的”替代品。这些类的主要目的是帮助实现 JVM 的“内部”。它们完全不受您的控制,随着时间的推移,它们几乎没有任何“保证”。

从这个意义上说,答案是:太阳异常是您根本不应该使用的异常;而 apache commons可能是一个不错的候选者。公共类的全部意义在于“公开”使用。

于 2018-01-24T09:27:04.357 回答
1

我可以用这个来回答。com.your.package.NotImplementedException和 和有什么不一样 org.apache.commons.lang3.NotImplementedException

sun.reflect.generics.reflectiveObjects.NotImplementedExceptionJDK内部 API,不用于用户代码。

于 2018-01-24T09:15:56.247 回答