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?
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?
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 ;)
...
}
}