5
respostas

Construtor private

Ao ver assinatura do construtor com o modificador de acesso public fiquei com uma dúvida: Faz algum sentido criar um construtor com modificador de acesso private?

5 respostas

Bom dia mano,

Faz sentido se você quiser que a classe não seja instanciada

Espero ter contribuido :D

Olá Felipe,

Acrescentando o que Samuel mencionou, por padrão os construtores são public, assim também como as assinaturas das interfaces. Se você retirar o public o java aceitará.

Usar o construtor como private é só uma forma diferente de escrever por exemplos constantes, mas isso poderia se resolver escrevendo apenas atributos private da classe.

Espero ter contribuído.

Obrigado pessoal, mas ainda não vi nenhuma utilidade prática para se criar um construtor private. Talvez para implementar um padrão Singleton.

Se alguém tiver um exemplo em que seria útil um construtor private eu agradeço.

De fato, só consigo pensar em uma classe de métodos staticos para não precisar de instância, nem precisa ser um Singleton, pense na possibilidade de ter uma classe de Utils, métodos que são frequentemente usados por seu programa, nesse caso não haveria necessidade de um construtor.

Um exemplo prático utilizando o padrão singleton com o construtor private é a recuperação de uma conexão de banco de dados.

A ideia é que você garanta que tenha apenas uma única instância para que assim o sistema não crie sessões desnecessárias do banco.

Conforme o padrão nos orienta, deve criar atributo conexao como static logo em seguida encapsula e obrigatoriamente criar o construtor como private, assim você garante que a classe terá apenas um único canal que retorna a instância, uma única conexão com a base.

public class ConexaoDAO {
    private static Optional<ConexaoDAO> conexao = Optional.empty();

    private ConexaoDAO() {
        System.out.println("abre conexão");
    }

    public static ConexaoDAO getInstance() {
        if (!conexao.isPresent()) {
            conexao = Optional.of(new ConexaoDAO());
        }

        return conexao.get();
    }
}

class Programa {
    public static void main(String[] args) {
        ConexaoDAO instance = ConexaoDAO.getInstance();

        //new ConexaoDAO(); ops #sqn ;)

        ...
    }
}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software