class Person
{
private BankAccount account;
Person(BankAccount account)
{
this.account = account;
}
public Person someMethod(Person person)
{
//Why accessing private field is possible?
BankAccount a = person.account;
}
}
Por favor, esqueça o design. Eu sei que OOP especifica que os objetos privados são privados para a classe. Minha pergunta é: por que o OOP foi projetado de forma que campos privados tenham acesso em nível de classe e não acesso em nível de objeto ?
someMethod
não é válido. Não retorna nada. Deve servoid
.Respostas:
Também estou um pouco curioso com a resposta.
A resposta mais satisfatória que encontrei é de Artemix em outro post aqui (estou renomeando o AClass com a classe Person): Por que ter modificadores de acesso de nível de classe em vez de nível de objeto?
EDITAR: Por favor, vote na resposta de Artemix. Estou apenas copiando e colando.
fonte
Person
, na classePerson
, não precisa saber a implementação de toda a classe. A boa prática é usar o acessador, sem precisar saber quais operações ele realiza.equals(Object)
método em uma classe Java para verificar a igualdade de umPerson
objeto com outra instância dePerson
. Você pode permitir que o mundo externo verifique se as duas instâncias são iguais, mas pode não querer expor todos os campos privados da classe necessários para verificar a igualdade para o mundo externo usando métodos de acesso público. Ter acesso em nível de classe aprivate
campos permite implementar tal método sem a necessidade induzida de implementar tais métodos públicos.equals
).equals
pode ser feita chamando acessadores privados.private
é necessário conceder acesso em nível de classe. Concordo que usar acessores geralmente é um bom hábito, embora, neste caso, seja principalmente uma questão de contexto e estilo pessoal. Observe que Joshua Bloch em Effective Java (item 8) e Tal Cohen neste artigo do Dr. Dobbs acessam diretamente campos privados em suas listagens de código ao discutir como implementarequals
.Veja a especificação da linguagem Java, Seção 6.6.1. Determinando Acessibilidade
Afirma
Clique no link acima para mais detalhes. Portanto, a resposta é: Porque James Gosling e os outros autores de Java decidiram que assim seria.
fonte
Boa pergunta. Parece que o modificador de acesso de nível de objeto reforçaria ainda mais o princípio do Encapsulamento.
Mas na verdade é o contrário. Vamos dar um exemplo. Suponha que você queira copiar em profundidade um objeto em um construtor, se não puder acessar os membros privados desse objeto. Então, a única maneira possível é adicionar alguns acessadores públicos a todos os membros privados. Isso deixará seus objetos expostos para todas as outras partes do sistema.
Portanto, o encapsulamento não significa estar fechado para todo o resto do mundo. Significa ser seletivo sobre com quem você deseja estar aberto.
fonte
o.deepCopy()
ou seja o que for.Isso funciona porque você está no
class Person
- uma classe tem permissão para cutucar seu próprio tipo de classe. Isso realmente ajuda quando você deseja escrever um construtor de cópia, por exemplo:Ou se quisermos escrever
operator+
eoperator-
para nossa aula de grande número.fonte
Apenas meus 2 centavos na questão de por que a semântica da visibilidade privada em Java é nível de classe em vez de nível de objeto.
Eu diria que a conveniência parece ser a chave aqui. Na verdade, uma visibilidade privada no nível do objeto teria forçado a expor métodos para outras classes (por exemplo, no mesmo pacote) no cenário ilustrado pelo OP.
Na verdade, não fui capaz de inventar nem encontrar um exemplo que mostrasse que a visibilidade no nível privado da classe (como o oferecido pelo Java) cria problemas se comparada à visibilidade no nível privado do objeto.
Dito isso, as linguagens de programação com um sistema mais refinado de políticas de visibilidade podem permitir a visibilidade do objeto no nível do objeto e no nível da classe.
Por exemplo , Eiffel oferece exportação seletiva: você pode exportar qualquer recurso de classe para qualquer classe de sua escolha, de {NENHUM} (objeto-privado) para {QUALQUER} (o equivalente a público, e também o padrão), para {PESSOA} (classe privada, veja o exemplo do OP), para grupos específicos de classes {PESSOA, BANCO}.
Também é interessante observar que em Eiffel você não precisa tornar um atributo privado e escrever um getter para evitar que outras classes atribuam a ele. Atributos públicos em Eiffel são por padrão acessíveis no modo somente leitura, então você não precisa de um getter apenas para retornar seu valor.
É claro que você ainda precisa de um setter para definir um atributo, mas pode ocultá-lo definindo-o como "atribuidor" para esse atributo. Isso permite que você, se desejar, use o operador de atribuição mais conveniente em vez da invocação do setter.
fonte
Porque o
private
modificador de acesso o torna visível apenas dentro da classe . Este método ainda está NA classe .fonte
o
private
campo está acessível na classe / objeto em que o campo está declarado. É privado para outras classes / objetos fora daquele em que está localizado.fonte
Com o conceito de reflexão em Java é possível modificar campos e métodos privados
Modificando metodos e campos privados com Refleccion en Java
fonte
A primeira coisa que temos que entender aqui é que tudo o que temos que fazer é seguir os princípios ops, então o encapsulamento é dizer que envolve os dados dentro do pacote (isto é, classe) e então representa todos os dados como Objetos e fáceis de acessar. portanto, se tornarmos o campo não privado, ele será acessado individualmente. e isso resulta em uma paratícia ruim.
fonte