【问题标题】:Private constructor defined in FileNotFoundException?FileNotFoundException 中定义的私有构造函数?
【发布时间】:2017-08-20 14:45:43
【问题描述】:

偶然发现了这个网站:http://resources.mpi-inf.mpg.de/d5/teaching/ss05/is05/javadoc/java/io/FileNotFoundException.html

FileNotFoundException 类定义了三个构造函数:

    FileNotFoundException()
          Constructs a FileNotFoundException with null as its error detail message.

    FileNotFoundException(String s)
          Constructs a FileNotFoundException with the specified detail message.

    private FileNotFoundException(String path, String reason)
          Constructs a FileNotFoundException with a detail message consisting of the given pathname string followed by the given reason string.

但是最后一个构造函数被定义为私有的?

同样,在这里:http://www.docjar.com/html/api/java/io/FileNotFoundException.java.html 我们可以看到完整的类定义。没有其他代码,所以单例模式显然没有用于那种情况,我们也看不到,为什么要防止在对象之外实例化类,也不是工厂方法,静态(实用程序类)方法或仅常量类。

我是 C# 开发人员,所以我可能不知道这里发生的一些事情,但我仍然会对为什么将其定义为私有、使用什么以及是否有任何示例或用例感兴趣最后一个构造函数。

评论中提到:

此私有构造函数仅由本机 I/O 方法调用。

有人详细解释一下吗?

【问题讨论】:

  • 好吧,还有什么要进一步解释的?显然他们决定 Java 代码不应该使用这个特定的构造函数。原因很难追查。

标签: java constructor private


【解决方案1】:

请记住:JVM 的很多库都是用 Java 编写的,比如那个例外。但是在与“世界其他地方”互动时; Java 迟早不会再做任何事情 - 需要使用 C/C++ 来进行真正的系统调用。

含义:某些与文件IO相关的操作在Java中是无法完全实现的。因此 native 代码进来(编译的二进制文件)。但当然,这样的调用也可能失败。但随后需要一种方法来在 Java 端传达这一点 - 换句话说:需要抛出异常。

鉴于您引用的 cmets,这似乎很简单:当某些与 IO 相关的 native 操作失败时;他们将使用该私有构造函数来创建异常,然后向“你”抛出异常。 是的native 方法可以调用 private 方法!

编辑:但是在查看implementation 时,该构造函数确实没有具体的内容人们可以使用与此私有 ctor 将创建的完全相同的消息轻松构造这样的异常。 p>

private FileNotFoundException(String path, String reason) {
  super(path + ((reason == null)
             ? ""
             : " (" + reason + ")"));
}

所以,我个人的猜测:这甚至可能是一些“剩菜”。 15年前有一定意义的东西;但不再具有“真正意义”。或者更简单,方便 方法允许本机代码传递 null 或非 null 原因字符串。

【讨论】:

  • 我想他的困惑更多是关于为什么它是私人的。
  • 本机方法不在这个类中,所以如果要从其他类调用构造函数,它不应该是私有的。
  • @11thdimension 构造函数不能从另一个类的一些Java代码调用。正如 javadoc 所说,它将从本机代码中调用。
  • @GhostCat 我猜这是一种方便的方法,用于简化本机代码,例如对于您提到的 null 处理。
  • 另外值得注意的是FileNotFoundException@since JDK1.0,但是私有构造函数是@since 1.2。他们可能想要方便的方法,但不想要更新 Java API 的逻辑开销,因此private
【解决方案2】:

有问题的构造函数是私有的,因此没有其他类可以使用它来初始化实例。原则上,它可以由类本身使用——当一个构造函数打算被另一个构造函数或工厂方法调用时,这种事情并不罕见。

但是,在这种情况下,文档提出了不同的原因,您实际上引用了该原因:

此私有构造函数仅由本机 I/O 方法调用。

这对我来说似乎很清楚,但我想您的困惑可能围绕着 Java 访问控制的细节——特别是它不适用于本机方法。因此,实现各种 I/O 功能的本机方法可以通过私有构造函数实例化 FileNotFoundException,而不管它们属于哪个类。

【讨论】:

    猜你喜欢
    • 2018-10-20
    • 2010-09-20
    • 2011-04-20
    • 2019-10-16
    • 1970-01-01
    相关资源
    最近更新 更多