Referência ao Objeto

8 respostas
S

Boa Tarde a todos… sou nova no mundo Java e orientação a objetos, estou começando agora a entender como o Java pensa, sempre programei em C e tenho algumas dificuldades para fazer algumas coisas.

Vou tentar simular meu problema.

Eu tenho uma classe Principal que é onde roda toda a minha aplicação. Dai eu tenho uma classe chamada MaterialDAO que faz a comunicação com o banco e criei uma classe chamada LerArquivo que irá ler um arquivo .txt com as informações para se conectar com o banco: IP, Driver, Usuário e Senha.

Eu queria q essas informações ficasse guardadas sempre para q eu precise ler o arquivo apenas quando abrir a aplicação, porém, já tentei colocar as variáveis no MaterialDAO (comunicação com o banco), mas cada vez q vou fazer alguma coisa eu dou um new e perco os valores. Já tentei colocar no próprio LerArquivo, mas eu teria q dar um new a partir de algum lugar e então eu teria q fazer uma nova leitura, oq eu naum quero. E já tentei colocar na própria página Principal, mas naum achei mto viável, gostaria de deixar as coisas separadas… e de qualquer forma eu teria q dar um new…

Desculpem a ignorância… estou apanhando do meu código… não sei oq posso fazer…

Se alguém tiver uma solução eu agradeceria mto…
Obrigada,
Sue Ellen

8 Respostas

I

Podes fazer por meio de lazy-programming:

public class FileLoader {
    private static Properties p;

    private FileLoader() {}

    public static synchronized Properties getProperties(final String path)
        throws IOException {

        if (p == null) {
            p = new Properties();
            p.load(new FileInputStream(path))
        }
        return p;
    }
}

Quando precisar carregar o arquivo de propriedades, usa assim:

final String path = "/temp/app/db.properties";
final Properties p = FileLoader.getProperties(path);
//...
B

Ola,

Vc pode usar variáveis estáticas para guardar estas informações, na classe que lê o arquivo, vc cria as variáveis com o modificador ‘static’, tipo:

private static String urlDB;

E aconselho a dar uma olhada no padrão Singleton, acho que ele se encaixa neste tua classe.

P

Sue Elle…o q ta rolando, eh q toda vez q vc da um new no seu DAO ele cria uma nova instancia do objeto…

vc precisa de uma classe Singleton, que é uma classe instanciada uma unica vez…e todo o resto da aplicação ira utilizar essa instancia…essa classe devera funcionar como uma fabrica de conexões, com métodos para abrir e fechar a conexão com o banco por exemplo…

isso deve te ajudar:

http://www.portaljava.com/home/modules.php?name=Content&pa=showpage&pid=38

J

Dê uma olhada sobre o Design Pattern “Singleton” em um vídeo que tem aí:

http://jairelton.com

S

Bom Dia a todos… primeiramente gostaria de agradecer a ajuda de todos…

Jair, não achei o vídeo que você mencionou…

Bom, eu nunca havia ouvido falar de Singleton, e depois de ver a dica de vocês dei uma pesquisada básica… então a classe MaterialDAO ficaria mais ou menos assim?:

public class MaterialDAO {

public static final MaterialDAO INSTANCE = new MaterialDAO();

private MaterialDAO() {



}



}

Pelo oq eu entendi, então essa classe daria um new logo que ela é chamada e eu não perderia os valores, correto?

Mas desculpa a dúvida, mas como eu faria para chamar a classe sem dar um new nela? Eu chamaria através do INSTANCE?

Obrigada mais uma vez,
Att,
Sue Ellen

OBS. Sobre criar variáveis estáticas, quando eu der um new na classe os valores não são perdidos?!

S

Pessoal, depois de pesquisar bastante, encontrei uma explicação bastante interessante sobre Design Pattern, entre eles o Singleton… Valeu a todos… irei utilizar e qualquer coisa posto aqui.

S

Boa Noite a todos…

Gostaria de pedir a ajuda de vcs mais uma vez…

Estava com o problema de ter que dar um new toda hora no objeto e agora estou utilizando o padrao Singleton nas classes onde preciso e estao funcionando perfeitamente, porem, estou com um problema.

Na tela principal eu nao posso utilizar esse padrao, pq na verdade quando ela abre ja eh como se fosse um new, certo? E se eu utilizar o singleton neste caso quando eu chamar o getInstance() ela vai dar um new novamente, oq faz com que eu perca a referencia principal.

Eu preciso de um jeito em que eu a instancie de forma diferente (sem dar o new). Eu dei uma olhada no padrao Factory, mas nao sei se funciona. Gostaria de saber de vcs qual a melhor forma de fazer isso.

Obrigada mais uma vez pela ajuda.
Att,
Sue Ellen

S

O que tu precisas é implementar a interface javax.sql.DataSource e torná-la um singleton. Ao mesmo tempo, essa implementação tem que ler os dados de conexão de um arquivo (melhor um properties) eis um esboço.

public class PropertiesDataSource implements DataSource {

     private static DataSource me;
     public static DataSource getDataSource (){
            if (me==null){
                 me = new PropertiesDataSource ();
            }
            return me;
     }

    public PropertiesDataSource (){
     // este construtor só é chamado uma unica vez na aplicação
     // lê properies do arquivo.
             Properties properties = new Properties();
             properties.load("caminho/do/arquivo"); 
      // inicializa driver
             String driver = (String)properties.get("driver");
             Class.foName(driver);
     }

     public Connection getConnection(){
             // cria conexão com DriverManager passando user e password
             Connection con = ...
             return con;  
     }

// outros métodos da interface datasource foram ignorados
// a implementação deles é trivial.

}

forma de uso

Connection con = PropertiesDataSource.getDataSource().getConnection();
Criado 11 de dezembro de 2006
Ultima resposta 15 de dez. de 2006
Respostas 8
Participantes 6