2012-07-15 28 views
5

的JavaDoc java.io.FileDescriptor.FileDescriptor()說:爲什麼java.io.FileDescriptor的構造函數是公共的?

構造一個(無效的)FileDescriptor對象。

如果沒有爲構造沒有目的,爲什麼它的訪問級別不聲明爲包私人

+2

你在錯誤的地方問錯人。你會得到很多意見和猜測,至少在問題結束之前是不具有建設性的,但只有真正知道的人不可能在這裏找到。 – EJP 2012-07-15 21:43:43

+0

@ s106mo我不同意這是一個錯誤,我不同意OP,它沒有任何目的:這只是乞討的問題。他們可能已經計劃例如Java.net.Socket使用它。我們不知道。 – EJP 2012-07-15 21:47:25

+1

@ s106mo *錯誤*不應該是一個令人滿意的答案,因爲它不正確。有一個原因,請參閱我的答案。 – Jeffrey 2012-07-16 01:04:01

回答

6

此構造函數是公開的,因爲它在java.io之外使用。

類使用new FileDescriptor()在JRE 7U4於Linux x86:

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(IE的JRE本身)還可以創建其自己的有效FileDescriptor,因此應被允許訪問FileDescriptor()。但是,沒有辦法將構造函數的訪問限制爲只有JRE類,因此它是公共的。

-2

你的回答能夠對類級的文檔中找到:

@Since JDK1.0

這也是問題,比如「爲什麼是Number一個抽象類,而非接口」的答案, 「爲什麼Vector是同步的?」等。

舊的類可能會也可能不會有@Deprecated警告,但Java在去除已棄用的功能方面確實很軟。像這樣的Cruft不斷出現,因爲這些類很有用,但內部Java升級過程往往不會刪除已棄用的方法,而是將它們放在一邊,因爲這樣可以在初始Java發行版之後始終保持向後兼容性。

+2

這告訴我們爲什麼構造函數仍然是公共的,但不是爲什麼它是公開的。 – Jeffrey 2012-07-15 21:25:58

+1

它還將意願不合意與意外的訪問控制相混淆。無法對此問題應用棄用。 @since 1.0不是這個問題的答案。 – EJP 2012-07-15 21:43:12

相關問題