Java ha un modificatore di accesso "protetto privato"?


160

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 facendo riferimento a questo è qui . La mia lezione di scuola si riferiva anche a questo modificatore di accesso (e diceva che esiste). Usandolo, tuttavia, si verifica un errore nel linguaggio Java.

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

Modifica: non sto cercando informazioni sulla protectedparola chiave.


60
La pagina trovata imposta un'intestazione HTTP "Ultima modifica" di: Lun, 26 febbraio 1996 18:14:04 GMT!
G. Sylvie Davies,

6
@Joe Sono tutto per chiudere le domande come duplicati quando possibile, ma non vedo nulla su un private protectedmodificatore combinato lì dentro.
jpmc26,

2
@ jpmc26 Vedi "In Java 1.0 c'era un modificatore di accesso aggiuntivo, protetto privato." Tuttavia, la risposta qui è un riassunto molto migliore della storia.
Joe

2
@Joe C'è davvero un riferimento a private protectedin quella risposta, ma non spiega perché o cosa gli è successo, di cosa tratta questa domanda.
m0skit0,

3
Qualcun altro trova spaventoso che l'OP lo stia imparando a scuola .... oltre 20 anni dopo che è stato rimosso dalla documentazione? Interessante lezione di storia, ma è ancora un po 'spaventoso il fatto che le persone stiano imparando qualcosa che è stato rimosso prima che Java 1 fosse nominato ...
XaolingBao

Risposte:


191

Rimozione del modificatore di accesso

Java originariamente aveva il private protectedmodificatore, ma è stato rimosso in JDK 1.0.2 (la prima versione stabile , Java 1.0 che conosciamo oggi). Alcuni tutorial su 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 plus private protected. Il private protectedlivello di accesso non è supportato nelle versioni di Java successive alla 1.0; non dovresti più usarlo nei tuoi programmi Java.

Un'altra risposta su SoftwareEngineering.SE afferma:

Java originariamente aveva un tale modificatore. È stato scritto private protectedma 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 si chiamava Oak. La prima versione stabile, JDK 1.0.2, si chiama Java 1.

Da questo, possiamo concludere che i tutorial relativi alla versione 1.0.2 si riferiscono alla primissima versione, JDK 1.0, in cui il linguaggio era chiamato Oak, ma quello di 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 di Java 1.0 , non lo troverai, perché come menzionato in precedenza, è stato rimosso in JDK 1.0.2, altrimenti noto come Java 1.0. Ciò è dimostrato di nuovo quando si guardano i tempi di "Ultima modifica" per il collegamento pubblicato. Il collegamento che hai pubblicato è stato modificato l'ultima volta nel febbraio del 1996. Java 1.0 / JDK 1.0.2, quando è private protectedstato 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 private protected, come questo . Per citare:

Cosa era protetto da privati?

All'inizio, il linguaggio Java consentiva alcune combinazioni di modificatori, uno dei quali era private protected. Il significato di private protectedera limitare rigorosamente la visibilità alle sottoclassi (e rimuovere l'accesso al pacchetto). Questo è stato successivamente ritenuto in qualche modo incoerente e eccessivamente complesso e non è più supportato. [5]

[5] Il significato del protectedmodificatore è cambiato nella versione Beta2 di Java e la private protectedcombinazione è apparsa allo stesso tempo. Hanno corretto alcune potenziali falle nella sicurezza, ma hanno confuso molte persone.

E SoftwareEngineering.SE supporta anche questo, dicendo che non valeva le incoerenze e la complessità aggiuntiva, quindi è stato rimosso all'inizio.

Interpretazione

La mia interpretazione di tutto ciò è che forse, ai tempi di Oak, entrambi potevano coesistere (da qui la combinazione). Dato che protectedil significato era cambiato 1 , potrebbe esserci stata la necessità di consentire privatee protectedallo stesso tempo. L'introduzione divenne troppo complessa e non ne valeva la pena, e alla fine fu abbandonata. Al momento del lancio di Java 1.0 / JDK 1.0.2, era stato eliminato e quindi non è stato trovato nella documentazione.


1 In Oak Language Specification , 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 protetti .

Questo è abbastanza diverso da quello che abbiamo oggi, l'accesso al pacchetto predefinito. Questo potrebbe aver spianato la strada al bisogno di private protected, perché privateera troppo restrittivo ed protectedera troppo indulgente.


Sono sicuro che non vale molto - ma ricordo quando è successo (stavo programmando da bambino ed ero molto interessato a questa nuova cosa di Java per qualche motivo) e mentre non riesco a trovare nessuna delle fonti originali - Ricordo le cose esattamente così quando li ho seguiti.
Benjamin Gruenbaum,

Early on, the Java language allowed for certain combinations of modifiers, Significa che c'era molto di più di un "Private Protected"?
XaolingBao

@XaolingBao Beh, certo, un accessor è come nessun accessorio :) I collegamenti forniti dovrebbero chiarire la tua domanda.
m0skit0,

52

Ci sono storie confuse / poco chiare:

Uno, dalla fonte di Princeton che hai inserito, e anche dagli archivi del MIT , afferma che:

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

Ma questa funzione non è specificata in alcuna documentazione ufficiale per Java 1.0 qui o qui .

La mia ipotesi è che questa funzionalità non sia arrivata alla versione 1.0 ufficiale, dal momento che le specifiche della lingua ufficiale risalgono all'agosto 1996 e la fonte Princeton è stata modificata l'ultima volta nel febbraio 1996 .

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


quindi il mio link è una versione precedente dello stesso contenuto? : D

Forse le informazioni mancanti hanno qualcosa a che fare con quella nota che hai messo.

@AndrewLi Da nessuna parte nessuno è dichiarato stabile sui riferimenti dati. Ed è sicuramente confuso fare riferimento a 1.0.2 come 1.0 quando esiste un 1.0 effettivo.
m0skit0,

10

Come suggerisce il collegamento fornito nella tua domanda, è private protectedstato usato in element/memberuna classe, quando vuoi che tu subclasspossa accedere all'elemento ma tenerlo nascosto ad altre classi nella sua package.

Javase confrontato con C++ha un concetto extra di elementi incapsulanti - e questo è un pacchetto . Si dovrebbe anche capire cosa è accessibile all'interno o all'esterno di un pacchetto Javaquando si tratta di questi specificatori di accesso come private, public& protected.

Si prega di notare che ho spiegato perché è stato utilizzato. Naturalmente non nella versione attuale


Il mio link è per l'accesso al metodo. Accesso non membro.

1
Lo stesso @MarkYisri può essere utilizzato anche per le variabili membro. gli identificatori di accesso non funzionano solo sui metodi ma anche sui vari membri. In altre parole, gli identificatori di accesso sono concetti di incapsulamento e indipendentemente dal fatto che vengano applicati su metodi o variabili membro. che si applica a quasi tutti i linguaggi orientati agli oggetti tra cui C ++ e java
programmer_of_the_galaxies

Va bene, ma il tutorial (interessante) non menziona la protezione privata delle variabili. Aspetta e fammi vedere se c'è una pagina delle variabili ...


0

No, non è possibile utilizzare sia privateun protectedinsieme. Il tuo tutorial è strano. Quello che hai è il cosiddetto pacchetto privato o nei riferimenti ot6 pacchetto protetto dall'accesso. Questo è l'accesso predefinito abilitato quando nessun qualificatore acc6 è scritto in modo esplicito.


3
Ero consapevole che non puoi usarlo. Voglio sapere cosa gli è successo, che le altre risposte spiegano meglio.

4
Bene, il collegamento è del 1996, quindi dato che lo sviluppo di Java era appena iniziato circa un anno prima, il contenuto del collegamento non è poi così strano: D
Keiwan

6
Un buon punto sulla data del documento. Ho risposto alla domanda mentre il mio treno stava arrivando e l'ho scritta per telefono, quindi mi dispiace se la risposta non è stata deragliata abbastanza. Volevo solo aiutare ...
AlexR,

6
@AlexR il tuo errore di ortografia deragliato è in realtà un gioco di parole . Appena notato. : D

1
@MarkYisri, dettagliato. Scrivere usando il telefono non è il modo migliore per pubblicare risposte su SO.
AlexR,

-2

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

Se desideri che la tua variabile / i tuoi metodi siano accessibili al di fuori del pacchetto, devi definire come specificatori protetti / pubblici, altrimenti privati ​​o altri tipi di accesso.

I metodi protetti sono generalmente accessibili da pacchetti esterni e all'interno di sottoclassi, ovvero una classe deve estendere la rispettiva classe per avvalersi di metodi definiti protetti.

I metodi / variabili privati ​​hanno portata all'interno della classe e non possono essere accessibili al di fuori della classe.

Quindi non puoi definire Private Protected allo stesso tempo!


Questo non ha risposto alla domanda. Ho chiesto perché non ha funzionato. Le altre risposte fanno un lavoro molto migliore nel rispondere alla domanda.

Per chiarire ulteriormente, so che non funziona più adesso, ma le altre risposte spiegano perché e cosa è successo in passato. Il tuo no.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.