O Java possui um modificador de acesso "protegido privado"?

160

Eu vi algumas referências se referirem a um modificador de acesso em Java chamado private protected(ambas as palavras juntas):

private protected someMethod() {

}

Uma das páginas que encontrei referente a isso está aqui . A lição da minha escola também se referiu a este modificador de acesso (e disse que ele existe). No entanto, usá-lo resulta em um erro na linguagem Java.

Tentei com variáveis ​​e métodos e tenho certeza de que não existe, mas quero uma explicação do que aconteceu. Foi considerado e depois rejeitado? Ou foi removido em uma versão mais recente do Java?

Editar: não estou procurando informações sobre a protectedpalavra - chave.


fonte
60
A página que você encontrou define um cabeçalho HTTP "Última modificação" em: Seg, 26 Fev 1996 18:14:04 GMT!
G. Sylvie Davies
6
@ Joe Eu sou a favor de fechar perguntas como burras, quando possível, mas não vejo nada sobre um private protectedmodificador combinado lá.
Jpmc26 3/01
2
@ jpmc26 Consulte "No Java 1.0, havia um modificador de acesso adicional, protegido por privacidade". No entanto, a resposta aqui é um resumo muito melhor da história.
Joe
2
@ Joe Há realmente uma referência a private protectedessa resposta, mas não explica o porquê ou o que aconteceu com ela, sobre o que é essa pergunta.
M0skit0
3
Alguém mais achou assustador que o OP estivesse aprendendo isso na escola ... mais de 20 anos depois de ter sido removido do Docs? Lição de história interessante, mas ainda um pouco assustador que as pessoas estão aprendendo algo que foi removido antes Java 1 foi nomeado ...
XaolingBao

Respostas:

191

Remoção do modificador de acesso

O Java tinha originalmente o private protectedmodificador, mas foi removido no JDK 1.0.2 (a primeira versão estável , o Java 1.0 que conhecemos hoje). Alguns tutoriais sobre o JDK 1.0.2 ( aqui e aqui ) dizem o seguinte:

Nota: A versão 1.0 da linguagem Java suporta cinco níveis de acesso: os quatro listados acima, mais private protected. O private protectednível de acesso não é suportado em versões do Java maiores que 1.0; você não deve mais usá-lo em seus programas Java.

Outra resposta no SoftwareEngineering.SE afirma:

O Java originalmente tinha esse modificador. Foi escrito, private protectedmas removido no Java 1.0.

Agora dê uma olhada no histórico de versões do Java :

JDK 1.0

A primeira versão foi lançada em 23 de janeiro de 1996 e denominada Oak. A primeira versão estável, JDK 1.0.2, é chamada Java 1.

A partir disso, podemos concluir que os tutoriais sobre a versão 1.0.2 se referem à primeira versão, JDK 1.0, onde o idioma foi chamado Oak, mas o de SoftwareEngineering.SE se refere à primeira versão estável, o JDK 1.0.2, chamada Java. 1.0, onde foi removido.

Agora, se você tentar procurá-lo na documentação do Java 1.0 , não o encontrará, porque, como mencionado anteriormente, ele foi removido no JDK 1.0.2, também conhecido como Java 1.0. Isso é comprovado novamente quando você olha para os horários "Última modificação" do link que você postou. O link que você postou foi modificado pela última vez em fevereiro de 1996. O Java 1.0 / JDK 1.0.2, quando private protectedfoi removido, foi lançado após fevereiro de 1996 e, de acordo com a especificação, agosto de 1996.

Motivo da retirada

Algumas fontes também explicam o motivo private protected, como este . Citar:

O que foi protegido privado?

No início, a linguagem Java permitia certas combinações de modificadores, um dos quais era private protected. O significado de private protectedera limitar a visibilidade estritamente às subclasses (e remover o acesso ao pacote). Mais tarde, isso foi considerado algo inconsistente e excessivamente complexo e não é mais suportado. [5]

[5] O significado do protectedmodificador mudou na versão Beta2 do Java, e a private protectedcombinação apareceu ao mesmo tempo. Eles corrigiram algumas falhas de segurança em potencial, mas confundiram muitas pessoas.

E o SoftwareEngineering.SE também suporta isso, dizendo que não valia as inconsistências e a complexidade extra, por isso foi removido desde o início.

Interpretação

Minha interpretação de tudo isso é que talvez, nos dias de Oak, ambos pudessem coexistir (daí a combinação). Desde que protectedo significado mudou 1 , pode ter havido uma necessidade de permissão privatee protectedao mesmo tempo. A introdução tornou-se muito complexa e não valia a pena, e foi descartada no final. Quando o Java 1.0 / JDK 1.0.2 foi lançado, ele havia sido descartado e, portanto, não pode ser encontrado na documentação.


1 Na Especificação da linguagem Oak , Seção 4.10, Acesso a variáveis ​​e métodos , observe que o modificador padrão era protected:

Por padrão, todas as variáveis ​​e métodos em uma classe são protegidos .

Isso é bem diferente do que temos hoje, o acesso ao pacote padrão. Isso pode ter aberto o caminho para a necessidade de private protected, porque privateera muito restritivo e protectedmuito branda.

Andrew Li
fonte
Tenho certeza de que não vale muito - mas lembro-me de quando aconteceu (eu estava programando quando criança e gostava muito dessa coisa nova de Java por algum motivo) e, embora não encontre nenhuma das fontes originais - lembro-me de coisas exatamente assim quando eu os segui.
Benjamin Gruenbaum
Early on, the Java language allowed for certain combinations of modifiers, Isso significa que havia mais do que apenas "Private Protected?"
XaolingBao 4/17/13
@XaolingBao Bem, é claro, um acessador é como nenhum acessador :) Os links fornecidos devem esclarecer sua pergunta.
precisa saber é o seguinte
52

Existem histórias confusas / pouco claras:

Um, da fonte de Princeton que você colocou e também dos arquivos do MIT , afirma que:

Nota: A versão 1.0 da linguagem Java suportava cinco níveis de acesso: os quatro listados acima, além de proteção privada. O nível de acesso protegido privado não é suportado em versões do Java superiores a 1.0; você não deve mais usá-lo em seus programas Java.

Mas esse recurso não está especificado em nenhuma documentação oficial para Java 1.0 aqui ou aqui .

Meu palpite é que esse recurso não chegou à versão oficial 1.0, já que a especificação do idioma oficial é de agosto de 1996 e a fonte de Princeton foi modificada pela última vez em fevereiro de 1996 .

PS: vergonha no Oracle por remover os arquivos para versões mais antigas.

m0skit0
fonte
meu link é uma versão mais antiga do mesmo conteúdo? : D
Talvez a informação que falta esteja relacionada com a nota que você colocou.
@AndrewLi Nowhere também não é declarado estável nas referências fornecidas. E é definitivamente confuso referir-se à 1.0.2 como 1.0 quando há uma 1.0 real.
M0skit0
10

Como o link que você forneceu na sua pergunta sugere private protectedfoi usado em uma element/memberclasse, quando você deseja subclassacessar o elemento, mas mantê-lo oculto de outras classes package.

Javase comparado a C++tem um conceito extra de elementos de encapsulamento - e esse é um pacote . Deve-se também entender o que é acessível dentro ou fora de um pacote Javaquando se trata desses especificadores de acesso como private, public& protected.

Observe que expliquei por que foi usado. Não está na versão atual, é claro

programmer_of_the_galaxies
fonte
Meu link é para acesso ao método. Não é acesso de membro.
1
@ MarkYisri o mesmo pode ser usado para variáveis ​​de membro também. os especificadores de acesso não funcionam apenas em métodos, mas também em vários membros. Em outras palavras, os especificadores de acesso são um conceito de encapsulamento e independentemente de você aplicá-lo a métodos ou variáveis ​​de membros. que se aplica a quase todas as linguagens orientadas a objeto, incluindo C ++ e Java
programmer_of_the_galaxies
Ok, mas o tutorial (curiosamente) não menciona private protected on variable. Segure-se e deixe-me ver se há uma página variáveis ...
0

Não, você não pode usar tanto privateum protectedconjunto. Seu tutorial é estranho. O que você tem é chamado de pacote privado ou no acesso protegido por pacotes ot6. Esse é o acesso padrão ativado quando nenhum qualificador acc6 é gravado explicitamente.

AlexR
fonte
3
Eu sabia que você não pode usá-lo. Quero saber o que aconteceu com ele, o que as outras respostas explicam melhor.
4
Bem, a ligação é entre 1996 assim, dado que o desenvolvimento Java tinha apenas começado cerca de um ano antes, o conteúdo do link não é realmente estranho: D
Keiwan
6
Bom ponto sobre a data do documento. Eu respondi a pergunta enquanto meu trem estava chegando e escrevi usando o telefone, desculpe se a resposta não foi descarrilada o suficiente. Só queria ajudar ...
AlexR 2/17/17
6
@AlexR seu erro de ortografia descarrilou é realmente um trocadilho (trem). Apenas notei. : D
1
@MarkYisri, detalhado. Escrever usando o telefone não é a melhor maneira de postar respostas no SO.
precisa saber é
-2

O escopo privado está dentro da classe existente. Onde Protegido pode ser acessado dentro do pacote e classe estendidos por classes em outros pacotes.

Sem problemas, se você deseja que suas variáveis ​​/ métodos tenham acesso fora do pacote, você precisa definir como protegido / público, caso contrário privado ou alguns outros especificadores de acesso.

Métodos protegidos são geralmente acessíveis a partir de pacotes externos e dentro de subclasses, ou seja, uma classe precisa estender a respectiva classe para obter métodos definidos protegidos.

Métodos / variáveis ​​particulares têm escopo dentro da classe e não podem ser acessíveis fora da classe.

Portanto, você não pode definir o Private Protected ao mesmo tempo!

Tejas Gowda
fonte
Isso não respondeu à pergunta. Perguntei por que não funcionou. As outras respostas fazem um trabalho muito melhor ao responder à pergunta.
Para esclarecer mais, sei que não funciona mais agora, mas as outras respostas explicam o porquê e o que aconteceu no passado. O seu não.