Estou lendo o livro: Use a cabeça - Padrões de Projeto e cheguei no singleton pattern. Até então eu nunca tinha pensado ou visto uma forma diferente de fazer a conexão com o banco de dados usando JDBC (sim, eu sou noob ^^). Sempre fazia uma “Fabrica de conexões” meio que assim:
public static Connection obterConexao() {
try {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root");
} catch (ClassNotFoundException | SQLException e) {
System.err.println(e.getMessage());
return null;
}
}
Com singleton ficou mais ou menos assim:
public class Conexao {
private Connection conexao;
private static volatile Conexao instanciaUnica;
private Conexao() {
try {
Class.forName("com.mysql.jdbc.Driver");
conexao = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root");
} catch (ClassNotFoundException | SQLException e) {
System.err.println(e.getMessage());
}
}
public static Conexao obterInstancia() {
if (instanciaUnica == null) {
synchronized (Conexao.class) {
if (instanciaUnica == null) {
instanciaUnica = new Conexao();
}
}
}
return instanciaUnica;
}
public Connection obterConexao() {
if (conexao != null) {
return conexao;
} else {
throw new NullPointerException("Variavel conexão não iniciada.");
}
}
Gostaria de saber se existe alguma diferença de eficiência? se sim, qual é a melhor é forma de fazer a conexão?
Será então que o double IF funciona para singleton???