Acessando Variaveis em MAIN

13 respostas
anjomal

Como eu faço por exemplo, eu tenho uma variavel na minha função public static void main e eu queria acessala de dentro de uma outra classe, dentro de um JFrame por exemplo tem jeito ?

:shock:

13 Respostas

C

Não, qualquer variável definida dentro de um método é acessível somente àquele método. Dependendo do que voce quer fazer voce pode passar a variável como parametro à um objeto de outra classe.

anjomal

E um Objeto Connection do pacote java.sql eu não quero fazer uma nova conexão em todas minhas Janelas então eu fiz uma Classse Chamada Database e Instancio ela em Main e queria que minhas outras classes vissem esse objeto para que eu crie as rotinas de manipulação de Dados dentro das suas respectivas classes, to querendo uma solução.

Valew se puder me Ajudar.
:lol:

C

Bom, esta é uma decisão que vai depender do seu projeto, Você pode utilizar o padrão Factory para fazer, ou, o que te daria menos trabalho, usar o padrão singleton:

class DataBase {

   //Objeto Connection
   Connection conn = null;

   //Objeto Database
   DataBase db = null;

   //Construtor PRIVADO
   private DataBase() {
       conn = DriverManager.getConnection(...);
   }

   //Retorna uma instancia de DB
   public static DataBase getDataBase() {
      if (this.db == null) {
          this.db = new DataBase();
      }
      return this.db;      
   }
   
}

O exemplo acima utiliza o padrão singleton, este padrão é utilizado quando você quer utilizar uma única instância de uma classe para toda uma aplicação (ou parte de uma aplicação), assim, tornando o construtor privado impede qualquer outra classe de criar novos objetos do tipo DataBase, a única maneira é a partir do método estático getDataBase() que mantém uma referência interna, caso esta referencia seja nula (ou seja, é a primeira vez que alguem chama este método) ele cria uma nova instância e a retorna, caso contrário, retorna a instância criada anteriormente.

Como utilizá-lo? Simples:

public static void main(String args[]) {
    DataBase db = DataBase.getDataBase();
}

Assim você pode chamar este código onde bem entender que estará lidando com o mesmo objeto, sem criar conexões desnecessárias. Apenas tome cuidado, pois dependendo do tamanho da sua aplicação, poderá ser necessário um pool de conexões para melhorar a performance etc. etc. Mas acredito que o singleton lhe atenderá :wink:

Qualquer dúvida estamos ai!

Carlos H.

anjomal

Po cara valew, vc me ajudou pra caramba, eu achava que o caminho era por ai, mais estava em duvida de como usar o singleton mais vc abriu os caminhos para mim, sou restou uma duvida como seria um POOL de conexões pois minha aplicação não e gigantesca mais tb não e pequena … existe uma solução dentro desse mesmo esquema ?

Valew pela respostas estamos ai pra ajudar …
t+

Seja Livre Use LINUX …
:smiley:

anjomal

Oque e melhor, eu ter uma conexão a cada classe solicitante ou eu ter uma classs statica com Singleton e chama-la dentro das classes que irão usala-la de modo que so terei uma conexão ?

Com uma classe livre mesmo sendo estendida eu terei uma conexão a cada instancia da minha classe.
Com uma classe baseada em Singleton eu terei uma conexão apenas na minha aplicação.

Pois minha duvida maior era , se eu ficar chamando metodos que realizam conexões a cada instancia, minha aplicação não vai ficar pesada ? pois toda hora vou ter de me logar no BD …

Valew pelas respostas e desculpe se eu falei besteira …
:smiley:

C

Dependendo da frequencia com que sua aplicação acessa uma base de dados, com certeza é melhor utilizar Singleton. Quanto ao connection poolling, você pode pegar uma idéia em http://www.mundooo.com.br/php/mooartigos.php?pa=showpage&pid=2

qualquer coisa estamos ai!

Abraços

Carlos H.

anjomal

Caro amigo carlos e amigos do GUJ pq este código abaixo gera um error do compilador, referencia invalida a this:

class DataBase { 

   //Objeto Connection 
   Connection conn = null; 

   //Objeto Database 
   DataBase db = null; 

   //Construtor PRIVADO 
   private DataBase() { 
       conn = DriverManager.getConnection(...); 
   } 

   //Retorna uma instancia de DB 
   public static DataBase getDataBase() { 
      if (this.db == null) { 
          this.db = new DataBase(); 
      } 
      return this.db;      
   } 
    
}

eu tive de mudar o codigo acima para que o compilador aceitasse do seguinte modo:

//Retorna uma instancia de DB 
   public static DataBase getDataBase() { 
      if (db == null) { 
          db = new DataBase(); 
      } 
      return db;      
   }

será que vai dar algum problema?

valew t+

:lol:

C

Oooooops!

Foi mal colega, quando digitei o código fiz com um pouco de pressa e me escapou um detalhe: um método estático não pode utilizar a referência this, e a forma como você arrumou o código está correta!

anjomal

Mais o código do jeito que está ta blz … precisa de mudar nada não ?

velew pela resposta …
:smiley:

C

Não não, é isso ai mesmo… :wink:

anjomal

O código completo da classe DATABASE vai pra vc dar uma olhada e ver se está blz …

public class Database {
	
	private static Connection conn = null;
	private static Database db = null;		

	private  Database(String Host,String Db,String User,String Pass) { 

		try {
			Class.forName("org.gjt.mm.mysql.Driver");
			
		} catch (ClassNotFoundException e) {
			JOptionPane.showMessageDialog(null,e.toString());
			System.exit(1);
		}

		try {
			conn = DriverManager.getConnection("jdbc:mysql://" + Host + "/" + Db + "?user=" + User + "&password=" + Pass  );
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,e.toString());
			System.exit(1);
		}
	}		
	
	//Retorna uma instancia de DB 
   public static Database getDataBase() { 
      if (db == null) { 
          db = new Database("localhost", "sicla", "root", "4991rs97");
      } 
      return db;      
   } 
   
   public Connection retConn(){
    	return conn;
   }

   public void finalize(){
		try {
			conn.close();			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,e.toString());
			System.exit(1);
		}
		
  }    
}

Blz …

C

É por ai mesmo colega… se pintar qualquer outra dúvida, estamos ai… :slight_smile:

anjomal

Valew pela ajuda

:wink:

Criado 17 de dezembro de 2002
Ultima resposta 18 de dez. de 2002
Respostas 13
Participantes 2