Java ha un modificatore di accesso "privato protetto"?


Ho visto alcuni riferimenti fare riferimento a un modificatore di accesso in Java chiamato private protected (entrambe le parole insieme):

private protected someMethod() {

}

Una delle pagine che ho trovato riferendosi a questo è qui. La mia lezione scolastica si riferiva anche a questo modificatore di accesso (e diceva che esiste). Il suo utilizzo, tuttavia, provoca un errore nel linguaggio Java.

Ho provato sia con variabili che con metodi e sono abbastanza sicuro che non esista, ma voglio una spiegazione di quello che è successo. È stato considerato, poi respinto? O è stato rimosso in una versione più recente di Java?

Edit: non sto cercando informazioni sulla parola chiave protected.

Author: Mark Yisri, 2017-01-02

5 answers

Rimozione del modificatore di accesso

Java aveva originariamente il modificatore private protected, ma è stato rimosso in JDK 1.0.2 (la prima versione stabile, la Java 1.0 che conosciamo oggi). Alcuni tutorial riguardanti JDK 1.0.2 ( qui e qui ) dicono quanto segue:

Nota: La versione 1.0 del linguaggio Java supportava cinque livelli di accesso: i quattro sopra elencati più private protected. Il livello di accesso private protected non è supportato nelle versioni di Java superiori alla 1.0; non dovresti più usarlo nei tuoi programmi Java.

Un'altra risposta su SoftwareEngineering.SE stati:

Java originariamente aveva un tale modificatore. È stato scritto private protected ma rimosso in Java 1.0.

Ora dai un'occhiata alla cronologia delle versioni di Java:

JDK 1.0

La prima versione è stata rilasciata il 23 gennaio 1996 e chiamata Oak. La prima versione stabile, JDK 1.0.2, si chiama Java 1.

Da questo, possiamo concludere che i tutorial riguardanti la versione 1.0.2 si riferiscono alla primissima versione, JDK 1.0, dove il linguaggio si chiamava Oak, ma quello da SoftwareEngineering.SE si riferisce alla prima versione stabile, JDK 1.0.2 chiamato Java 1.0, dove è stato rimosso.

Ora se provi a cercarlo nella documentazione Java 1.0 , non lo troverai, perché come accennato in precedenza, è stato rimosso in JDK 1.0.2, altrimenti conosciuto come Java 1.0. Questo è dimostrato di nuovo quando si guardano i tempi di "Ultima modifica" per il link che hai postato. Il link che hai postato è stato modificato l'ultima volta nel febbraio del 1996. Java 1.0 / JDK 1.0.2, quando private protected è stato rimosso, è stato rilasciato dopo il febbraio del 1996 e, secondo le specifiche, nell'agosto del 1996.

Motivo della rimozione

Alcune fonti spiegano anche il motivo di private protected, come questo. Per citare:

Cosa era privato protetto?

All'inizio, il linguaggio Java consentiva alcune combinazioni di modificatori, una delle quali era private protected. Il significato di private protected era di limitare la visibilità strettamente alle sottoclassi (e rimuovere l'accesso ai pacchetti). Questo è stato successivamente ritenuto un po ' incoerente e eccessivamente complesso e non è più supportato.[5]

[5] Il significato del modificatore protected è cambiato nella versione Beta2 di Java e la combinazione private protected è apparsa allo stesso tempo. Hanno patchato qualche potenziale buchi di sicurezza, ma confuso molte persone.

E il SoftwareEngineering.SE supporta anche questo, dicendo che non valeva la pena le incongruenze e la complessità extra, quindi è stato rimosso presto.

Interpretazione

La mia interpretazione di tutto questo è che forse, ai tempi della Quercia, entrambi erano autorizzati a coesistere (da qui la combinazione). Dal momento che il significato di protected era cambiato1, potrebbe essere stato necessario consentire private e protected allo stesso tempo. L'introduzione è diventata troppo complessa e non ne valeva la pena, ed è stata quindi abbandonata alla fine. Con il tempo Java 1.0/JDK 1.0.2 rotolato intorno, era stato abbandonato e quindi non può essere trovato nella documentazione.


1Nella specifica del linguaggio Oak , Sezione 4.10, Accesso a variabili e metodi, si nota che il modificatore predefinito era protected:

Per impostazione predefinita tutte le variabili e i metodi in una classe sono protetto .

Questo è molto diverso da quello che abbiamo oggi, l'accesso pacchetto predefinito. Questo potrebbe aver aperto la strada alla necessità di private protected, perché private era troppo restrittivo e protected era troppo indulgente.

 189
Author: Li357, 2017-04-13 12:45:55

Ci sono storie confuse/poco chiare:

Uno, dalla fonte di Princeton che hai messo, e anche da MIT archives, afferma che:

Nota: la versione 1.0 del linguaggio Java supportava cinque accessi livelli: i quattro sopra elencati più privato protetto. Privato il livello di accesso protetto non è supportato nelle versioni di Java superiori di 1.0; non dovresti più usarlo nei tuoi programmi Java.

Ma questa funzione non è specificata su nessuno documentazione ufficiale per Java 1.0 qui o qui.

La mia ipotesi è che questa funzione non è arrivata alla versione ufficiale 1.0, poiché la specifica della lingua ufficiale è dell'agosto 1996 e Princeton source è stata modificata per l'ultima volta nel febbraio 1996 .

PS: vergognati di Oracle per aver rimosso gli archivi per le versioni precedenti.

 53
Author: m0skit0, 2017-01-03 18:18:13

Come suggerisce il link che hai fornito nella tua domanda private protected è stato utilizzato su un element/member di una classe, quando vuoi che il tuo subclass sia in grado di accedere all'elemento ma tenerlo nascosto da altre classi nel suo package.

Java se confrontato con C++ha un concetto extra di incapsulamento di elementi - e questo è un pacchetto . Si dovrebbe anche capire cosa è accessibile all'interno o all'esterno di un pacchetto in Java quando si tratta di questi access-specifier come private, public & protected.

Si prega di notare che ho spiegato perché è stato utilizzato. Non nella versione corrente ovviamente

 12
Author: Game_Of_Threads, 2017-02-01 08:38:18

No, non è possibile utilizzare entrambi private a protected insieme. Il tuo tutorial è strano. Quello che hai è il cosiddetto pacchetto privato o nei riferimenti ot6 accesso protetto al pacchetto. Questo è l'accesso predefinito che viene abilitato quando nessun qualificatore acc6 è scritto esplicitamente.

 1
Author: AlexR, 2017-01-02 18:28:22

L'ambito privato è all'interno della classe esistente. In cui protetto può essere l'accesso all'interno del pacchetto e della classe esteso da classi in altri pacchetti.

Senza soluzione di continuità se si desidera che la variabile/i metodi siano accessibili al di fuori del pacchetto, è necessario definire come protetto/pubblico altrimenti privato o altri specificatori di accesso.

I metodi protetti sono di solito accessibili dall'esterno del pacchetto e all'interno delle sottoclassi, cioè una classe deve estendere la rispettiva classe per usufruire della protezione definita metodo.

I metodi/variabili privati hanno ambito all'interno della classe.Non possono essere accessibili al di fuori della classe.

Quindi non è possibile definire Private Protected allo stesso tempo!

 -3
Author: Tejas Gowda, 2017-01-29 15:41:01