为什么java.io.FileDescriptor';什么是公共的?

为什么java.io.FileDescriptor';什么是公共的?,java,Java,JavaDoc for表示: 构造(无效)FileDescriptor对象 如果构造函数没有用途,为什么它的访问级别没有声明为包私有?您的答案可以在类级文档中找到: @自JDK1.0以来 这也是“为什么数字是一个抽象类而不是一个接口”、“为什么向量是同步的?”等问题的答案 那么旧的类上可能有@Deprecated警告,也可能没有@Deprecated警告,但是Java在删除不推荐的特性方面非常软。像这样的错误之所以不断出现,是因为类很有用,而内部Java升级过程往往不会删除不推荐的方法,而是保留

JavaDoc for表示:

构造(无效)FileDescriptor对象


如果构造函数没有用途,为什么它的访问级别没有声明为包私有?

您的答案可以在类级文档中找到:

@自JDK1.0以来

这也是“为什么数字是一个抽象类而不是一个接口”、“为什么向量是同步的?”等问题的答案


那么旧的类上可能有@Deprecated警告,也可能没有@Deprecated警告,但是Java在删除不推荐的特性方面非常软。像这样的错误之所以不断出现,是因为类很有用,而内部Java升级过程往往不会删除不推荐的方法,而是保留它们,因为这样可以从最初的Java版本开始一直保持向后兼容性。

此构造函数是公共的,因为它在
Java.io
之外使用

在JRE 7u4 Linux x86中使用
new FileDescriptor()

java.io.FileInputStream
java.io.FileOutputStream
java.io.RandomAccessFile

java.lang.UNIXProcess
java.net.AbstractPlainDatagramSocketImpl
java.net.AbstractPlainSocketImpl
java.net.ServerSocket

sun.net.sdp.SdpSupport
sun.nio.ch.FileChannelImpl
sun.nio.ch.FileDispatcherImpl
sun.nio.ch.IOUtil
sun.nio.ch.PipeImpl
sun.nio.ch.SctpServerChannelImpl
sun.nio.ch.ServerSocketChannelImpl
sun.nio.ch.UnixAsynchronousServerSocketChannelImpl
sun.nio.fs.UnixChannelFactory
有一个
sun.misc.SharedSecrets
方法,允许程序员将
FileDescriptor
的状态更改为有效状态(此代码段可在
java.io.FileDescriptor
中找到):


这意味着,任何可以访问
SharedSecrets
(即JRE本身)的代码也可以创建自己的有效
FileDescriptor
,因此应该允许访问
FileDescriptor()
。但是,无法将构造函数的访问限制为仅对JRE类的访问,因此它是公共的。

这告诉我们为什么构造函数仍然是公共的,而不是为什么它最初是公共的。它还将不赞成与意外的访问控制混为一谈。无法对此问题应用弃用@因为1.0不是这个问题的答案。你在错误的地方问了错误的人。你会得到很多的意见和猜测,至少在问题以没有建设性的方式结束之前是这样,但在这里不太可能找到真正知道的人。@S106M我不同意这是一个错误,我也不同意OP没有目的的说法:那只是在乞求问题。他们可能已经计划使用它,例如Java.net.Socket。我们不知道。@s106mo错误地应该不是令人满意的答案,因为它不正确。这是有原因的,请看我的答案。@EJP我不是在寻求意见或猜测。“知道的人不太可能在这里找到”并不意味着问题本身不适合常见问题解答。这些人还活着,因此这是一个可以回答的问题。
  static {
        sun.misc.SharedSecrets.setJavaIOFileDescriptorAccess(
            new sun.misc.JavaIOFileDescriptorAccess() {
                public void set(FileDescriptor obj, int fd) {
                    obj.fd = fd;
                }

                public int get(FileDescriptor obj) {
                    return obj.fd;
                }

                public void setHandle(FileDescriptor obj, long handle) {
                    obj.handle = handle;
                }

                public long getHandle(FileDescriptor obj) {
                    return obj.handle;
                }
            }
        );
    }