Ponto pacífico que singletons são mal usados por aí e, portanto, configura-se um antipattern. Porém, alguém teria um exemplo de onde um singleton é bem vindo? De preferência, com um trecho de código.
SessionFactory eh bem melhor injetado do que como Singleton (ou testar vira um inferno).
deus é um bom exemplo se for em um aplicativo católico, se for um aplicativo celta ou egípcio ja mia…
[joke mode]
Como assim Deus é um singleton? E o esquema da Santissima trindade?
Deus implementa Três Interfaces (Pai, Filho e Espírito Santo)?
As outras entidades (Filho e Espírito Santo) implementam uma indireção com Deus?
Deus é uma superclasse? Ou é a própria JVM?]
Deus me perdoará por este post?
[/joke mode]
Comentário perfeito!
Galera eu estou aprendendo Java, e pelo menos acho que ja estou bom nos fundamentos e agora começei a ler sobre Singleton e estava tentando reestruturar uma classe que eu tinha de conexão com o DB, mas estou tendo alguma dificuldades bobas e precisava de alguma ajuda.
O que eu devo mudar pra deixar esta classe dentro do padrão (ou melhor forma)
[code]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
-
Classe Singleton responsável pela conexão com o Bando de Dados Oracle 9i
-
utilizando driver 9.0.2
*/
public class ConexaoDB {private static Connection conn = null;
private static String user;
private static String password;
private static String db;
private static String port;
private static String IP;
/**
*/
private ConexaoDB() {
try {
Class.forName(“oracle.jdbc.OracleDriver”);
conn = DriverManager.getConnection(“jdbc:oracle:thin:” + user + “/”
+ password + “@” + IP + “:” + port + “:” + db);} catch (SQLException sqle) { sqle.printStackTrace(); } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } // try
}
public synchronized static Connection getInstance() {
if (conn == null) {
conn = new ConexaoDB();
}
return conn;
}
}[/code]
o método getInstance não está legal estou com problemas de como resolver ele
Obs: se for possivel (não quero abusar) se pudessem postar explicações aqui msm ou em algum outro tópico do GUJ, pois não tenho acesso em nenhum outro site.
Obrigado pela ajuda galera
Ok, seu método getInstance retorna um objeto do tipo Connection. Sua variável também é do tipo Connection, então, como você espera dar um new ConexaoDB() nela?
Então vamos lá. O primeiro passo para o seu singleton é remover todos os atributos estáticos. Se você terá somente uma instância dessa classe, pode usar os atributos dessa instância.
Projete a classe normalmente, como se ela não fosse um singleton, depois:
- Deixe o seu construtor privado;
- Crie o atributo estático para a instância única da sua classe;
- Crie o método estático para obter essa instância.
No seu caso, acho que a classe ficaria mais ou menos assim:
[code]
public class ConexaoDB {
private static ConexaoDB myInstance = null;
private Connection conn = null;
private String user;
private String password;
private String db;
private String port;
private static String IP;
private ConexaoDB() {
try {
Class.forName(“oracle.jdbc.OracleDriver”);
conn = DriverManager.getConnection(“jdbc:oracle:thin:” + user + “/” + password + “@” + IP + “:” + port + “:” + db);
} catch (SQLException sqle) {
sqle.printStackTrace();
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
} // try
}
public synchronized static ConexaoDB getInstance() {
if (conn == null) {
conn = new ConexaoDB();
}
return conn;
}
//Demais getters
}[/code]
O uso da classe fica simplesmente:
if (ConexaoDB.getInstance().getUser.equals("XYZ")) {
Connection conn = ConexaoDB.getInstace().getConnection();
//....
}
...
Só lembre-se que o singleton uma vez criado, não será mais removido de seu programa. Preste especial cuidado para recursos que ficam abertos e precisam de tratamento especial para serem fechados, como é o caso de uma Connection.
Desculpa a incapacitação de compreenção, mas ta treta entender. Estou pensando assim, mas é certeza que isso ta errado ta com cheiro de gambiarra.
Poderiam demostrar uma classe de controle a Bando de Dados pra eu poder me basear legal, mas ainda vou mandar a minha pra vcs darem uma criticada legal ai como ajuda.
Vw Galera
[code]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConexaoDB {
private static ConexaoDB myInstance = null;
private Connection conn = null;
private String user;
private String password;
private String db;
private int port;
private static String IP;
private ConexaoDB() {
try {
Class.forName("oracle.jdbc.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:" + user + "/"
+ password + "@" + IP + ":" + port + ":" + db);
} catch (SQLException sqle) {
sqle.printStackTrace();
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
} // try
}
public synchronized static ConexaoDB getInstance() {
if (myInstance == null) {
myInstance = new ConexaoDB();
}
return myInstance;
}
private Connection getConn() {
if (conn == null) {
getInstance();
} // if
return conn;
}
private synchronized void setDeath() {
myInstance = null;
}
}[/code]
O método setDeath dessa forma pode fazer o seu Singleton deixar de ser singleton!
Outra coisa, qual é a idéia por trás de tantos métodos synchronized? Se for manter o seu código thread-safe, não está indo por um bom caminho, já que você vai retornar a mesma conexão para várias threads. O ideal seria criar uma conexão por thread, usando um thread local, ou criar um Pool de conexões. Como isso não é tarefa das mais fáceis, você pode pegar um pool pronto, como do projeto Jakarta DBCP.
Blz, quando chegar em casa do uma olhada, pois aqui é tudo bloqueado.
Mas blz, vo tentar estudar mais alguma outra coisa.
Vlww 8)
Tenho que fazer um projeto pra faculdade usando o padrão singleton.
Mais não sei qual aplicação??? Preciso de uma idéia para fazer o programa…
Vlw
:idea:
Bom dia a todos.
[joke mode]
Como assim Deus é um singleton? E o esquema da Santissima trindade?
Deus implementa Três Interfaces (Pai, Filho e Espírito Santo)?
As outras entidades (Filho e Espírito Santo) implementam uma indireção com Deus?
Deus é uma superclasse? Ou é a própria JVM?]
Deus me perdoará por este post?
[/joke mode]
[/quote]
Já dizia Lavosier que DEUS é o Perfeito Filósofo, Químico, Físico, Astrônomo, Matemático, …enfim, até em outras Ciências desconhecidas do homem. Portanto DEUS não é uma Superclasse, DEUS não é um programa, além de DEUS ser o nosso Pai, ele também é o Pai da Ciência.
Só por esta razão, de DEUS ser também o nosso Pai, acredito que Ele te perdoará, assim como já me perdoou várias vezes.
Contudo, como aqui não é o espaço para falar de religião, voltemos ao foco, e vamos falar sobre Singleton e Hibernate, gostaria de aprender sobre o assunto.
Um bom exemplo de Singleton?
System.out
System.err
Procure no javadoc por Runtime e Desktop. São dois singletons.
Mais sobre singleton verdadeiros aqui
[quote=peczenyj]Um bom exemplo de Singleton?
System.out
System.err[/quote]
Isso não são singletons, são atributos estáticos. Vc pode mudá-los com setIn e setOut; (Ver javadoc)
System em si é um exemplo de Registry, não de singleton.
Posso mudar o ‘out’ globalmente? WOW!
Como vc achava que o eclipse consegue mostar numa janela de SWT o que o seu programa escreve no system.out ? Magia ? :lol:
Ora, redirecionar a stdout não é misterio para quem conhece unix pipes
[quote=osmio]Out of context:
Isso não depende do ponto de vista? Rsrsrs
Se eu deitar embaixo da cascata, do meu ponto de vista, a água cai pra cima!
[/quote]
Não depende do ponto de vista. Já que nessa posição invertida vc não consegue fazer a água cair para baixo
(Isto estuda-se na fisica como a Segunda Lei da Termodinamica acoplada ao conceito de Referencial Mecânico)
Ou seja, sempre apenas um dos processo é possivel mas não inverso. E essa é a essência da frase.