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