Modificadores de acesso, onde e como usar, onde não usar?

normalmente tenho muitas duvidas entre colocar private, public e protected ou nenhum deles… quais casos deve ser obrigatória a colocação, ou quais casos não se deve colocar de jeito nenhum
e também gostaria de saber casos de usar ou não o void…
obrigada :wink:

Você sabe que quando não se põe um modificador de acesso, é como se fosse um modificador chamado “package private” (ou seja, visível apenas dentro do pacote)?

urrum é default né?

  1. Coloque como public todos os métodos ou constantes que outras classes deverão enxergar. Métodos como os getters, por exemplo. É provável que haja um construtor público também. Nunca crie atributos public.;

  2. Coloque como private praticamente todo resto. Isso inclui até mesmo alguns sets, quando os valores não forem modificáveis de fora da classe. E também é provavel que todos os atributos da classe serão private.

  3. Use protected para atributos, métodos e construtores que devam ser vistos através de herança. Há uma discussão interminável aqui se atributos devem ser declarados mesmo como protected, ou se apenas deve-se mantê-los private e definir um método protected para acessá-los. Se sua classe não foi feita para ser herdada, é pouco provável que você vá usar esse modificador.

  4. Deixe sem modificador (package private) métodos que farão comunicação entre as classes num mesmo pacote, ou classes que só pertencem a um único pacote. Geralmente vc não vai usar esse modificador até que desenvolva um projeto de classes, ou uma API.

É curioso que justamente o modificador default (“package private”) não acabe sendo muito usado, porque é efetivamente difícil decidir quando ele deve ser usado.

Se eu fosse projetar a linguagem Java, provavelmente o que seria default seria o “private” - como é no C++, onde se você não usar um modificador, a visibilidade é “private” dentro de uma classe.

// Código C++
// Em C++, como não pus um modificador de acesso, a variável de instância "x" é privada.
class Teste {
    int x;
};
// Abaixo indicando que getX e setX são públicas, e x recebe a visibilidade default (private).
class Teste2 {
    int x;
public:
    int getX() { return x; }
    void setX (int x) { this->x = x; }
};

Somos 2.
Eu também faria o protected se comportar igual ao protected do C++ e não ser tão permissivo quanto no java.