2012-07-15 13 views
5

JavaDoc dla java.io.FileDescriptor.FileDescriptor() mówi:Dlaczego konstruktor java.io.FileDescriptor jest publiczny?

Konstruuje (nieprawidłowy) obiektu deskryptora pliku.

Jeśli nie ma cel dla konstruktora, dlaczego nie jest to poziom dostępu uznane za pakiet-prywatnego?

+2

Pytasz niewłaściwych ludzi w niewłaściwym miejscu. Otrzymasz wiele opinii i zgadywania, przynajmniej do czasu, gdy pytanie zostanie zamknięte, ponieważ nie jest konstruktywne, ale jedyne osoby, które rzeczywiście wiedzą, są mało prawdopodobne, aby je tu znaleźć. – EJP

+0

@ s106mo Nie zgadzam się, że to pomyłka, i nie zgadzam się z OP, że nie ma na to celu: to tylko pytanie. Być może planowali np. Java.net. Gniazdo do korzystania z niego. Nie wiemy. – EJP

+1

@ s106mo * przez pomyłkę * nie powinno być satysfakcjonującą odpowiedzią, ponieważ nie jest poprawna. Jest powód, zobacz moją odpowiedź. – Jeffrey

Odpowiedz

6

Ten konstruktor jest publiczny, ponieważ jest używany poza java.io.

Ćwiczenia wykorzystujące new FileDescriptor() w 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 

Jest sun.misc.SharedSecrets metoda, która pozwala programiście zmienić stan na FileDescriptor do ważnego jeden (ten fragment znaleźć w 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; 
       } 
      } 
     ); 
    } 

Oznacza to, że każdy kod, który może uzyskać dostęp do SharedSecrets (np. Sam JRE), może również utworzyć własny poprawny FileDescriptor, dlatego powinien mieć dostęp FileDescriptor(). Jednak nie ma możliwości ograniczenia dostępu konstruktora tylko do klas JRE, więc jest on publiczny.

-2

Twoja odpowiedź można znaleźć w dokumentacji poziomie klasy:

@since JDK1.0

Jest to również odpowiedź na takie pytania jak „Dlaczego Ilość klasą abstrakcyjną zamiast interfejsu” "Dlaczego wektor jest zsynchronizowany?", Itp.

Klasy, które są tak stare, mogą mieć lub nie mieć @Deprecated ostrzeżenia na nich, ale Java jest bardzo miękka w usunięciu przestarzałych funkcji. Cruft w ten sposób pojawia się, ponieważ klasy są przydatne, ale wewnętrzny proces aktualizacji Java raczej nie usuwa przestarzałych metod, ale zachowuje je, ponieważ zachowuje kompatybilność wstecz aż do początkowej wersji Java.

+2

To wyjaśnia, dlaczego konstruktor jest nadal publiczny, ale nie dlatego, że był on publiczny. – Jeffrey

+1

Łączy również przestarzałość z nieoczekiwaną kontrolą dostępu. W tym przypadku nie można zastosować wycofania. @since 1.0 nie jest odpowiedzią na to pytanie. – EJP

Powiązane problemy