为什么java.io.FileDescriptor的构造函数是公共的?

时间:2012-07-15 21:04:14

标签: java

java.io.FileDescriptor.FileDescriptor()的JavaDoc说:

  

构造一个(无效的)FileDescriptor对象。

如果构造函数没有用处,为什么它的访问级别未声明为 package-private

2 个答案:

答案 0 :(得分:6)

此构造函数是公共的,因为它在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中的此代码段):

  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;
                }
            }
        );
    }

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

答案 1 :(得分:-2)

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

@since JDK1.0

这也是诸如“为什么数字是抽象类而不是接口”,“为什么矢量同步?”等问题的答案。

旧的类可能会或可能不会有@Deprecated警告,但Java在删除已弃用的功能时非常软。像这样的Cruft一直在出现,因为这些类很有用,但内部Java升级过程往往不会删除已弃用的方法,而是保留它们,因为自从最初的Java发布以来,它始终保持向后兼容性。