Modificador de acesso Java "privado"

Modificador de acesso Java "privado"

1. Visão geral

Na linguagem de programação Java, campos, construtores, métodos e classes podem ser marcados comaccess modifiers. Neste tutorial, vamos falar sobre o modificador de acessoprivate em Java.

2. A palavra-chave

O modificador de acessoprivate é importante porque permite o encapsulamento e o ocultamento de informações, que são princípios básicos da programação orientada a objetos. O encapsulamento é responsável por agrupar métodos e dados, enquanto o ocultamento de informações é uma consequência do encapsulamento - ele oculta a representação interna de um objeto.

A primeira coisa a lembrar é queelements declared as private can be accessed only by the class in which they’re declared.

3. Campos

Agora, veremos alguns exemplos de código simples para entender melhor o assunto.

Primeiro, vamos criar uma classeEmployee contendo algumas variáveis ​​de instânciaprivate:

public class Employee {
    private String privateId;
    private boolean manager;
    //...
}

Neste exemplo, marcamos a variávelprivateId comoprivate porque queremos adicionar alguma lógica à geração de id. E, como podemos ver, fizemos a mesma coisa com o atributomanager porque não queremos permitir a modificação direta deste campo.

4. Construtores

Vamos agora criar um construtorprivate:

private Employee(String id, String name, boolean managerAttribute) {
    this.name = name;
    this.privateId = id + "_ID-MANAGER";
}

Ao marcar nosso construtor comoprivate, podemos usá-lo apenas de dentro de nossa classe.

Vamos adicionar um métodostatic que será nossa única maneira de usar este construtorprivate de fora da classeEmployee:

public static Employee buildManager(String id, String name) {
    return new Employee(id, name, true);
}

Agora podemos obter uma instância de gerenciador de nossa classeEmployee simplesmente escrevendo:

Employee manager = Employee.buildManager("123MAN","Bob");

E, nos bastidores, é claro, o métodobuildManager chama nosso construtorprivate.

5. Métodos

Vamos agora adicionar um métodoprivate à nossa classe:

private void setManager(boolean manager) {
    this.manager = manager;
}

E vamos supor, por algum motivo, que temos uma regra arbitrária em nossa empresa em que apenas um funcionário chamado "Carl" pode ser promovido a gerente, embora outras classes não saibam disso. Vamos criar um métodopublic com alguma lógica para lidar com esta regra que chama nosso métodoprivate:

public void elevateToManager() {
    if ("Carl".equals(this.name)) {
        setManager(true);
    }
}

6. private em ação

Vejamos um exemplo de como usar nossa classeEmployee de fora:

public class ExampleClass {

    public static void main(String[] args) {
        Employee employee = new Employee("Bob","ABC123");
        employee.setPrivateId("BCD234");
        System.out.println(employee.getPrivateId());
    }
}

Depois de executarExampleClass, veremos sua saída no console:

BCD234_ID

Neste exemplo, usamos o construtorpublic e o métodopublicchangeId(customId) porque não podemos acessar a variávelprivateprivateId diretamente.

Vamos verwhat happens if we try to access a private method, constructor, or variable de fora de nossa classeEmployee:

public class ExampleClass {

    public static void main(String[] args) {
        Employee employee = new Employee("Bob","ABC123",true);
        employee.setManager(true);
        employee.privateId = "ABC234";
    }
}

We’ll get compilation errors para cada uma de nossas declarações ilegais:

The constructor Employee(String, String, boolean) is not visible
The method setManager(boolean) from the type Employee is not visible
The field Employee.privateId is not visible

7. Aulas

Existeone special case where we can create a private class - como uma classe interna de alguma outra classe. Caso contrário, se declarássemos uma classe externa comoprivate, estaríamos proibindo outras classes de acessá-la, tornando-a inútil:

public class PublicOuterClass {

    public PrivateInnerClass getInnerClassInstance() {
        PrivateInnerClass myPrivateClassInstance = this.new PrivateInnerClass();
        myPrivateClassInstance.id = "ID1";
        myPrivateClassInstance.name = "Bob";
        return myPrivateClassInstance;
    }

    private class PrivateInnerClass {
        public String name;
        public String id;
    }
}

Neste exemplo, criamos uma classe internaprivate dentro de nossoPublicOuterClass  especificando o modificador de acessoprivate.

Como usamos a palavra-chaveprivate, se, por algum motivo,try to instantiate our PrivateInnerClass from outside the PublicOuterClass, o código não compilar e veremos o erro:

PrivateInnerClass cannot be resolved to a type

8. Conclusão

Neste tutorial rápido, discutimos o modificador de acessoprivate em Java. É uma boa maneira de conseguir o encapsulamento, o que leva à ocultação de informações. Como resultado, podemos garantir que expomos apenas os dados e comportamentos que queremos para outras classes.

Como sempre, o exemplo de código está disponívelover on GitHub.