Variaveis Globais

Boas pessoal,

tenho tres classes simples ,

na primeirs classe instanciei duas Strings variavelGlobalUser e variavelGolbalPass. E quero que esta class guarde para o resto do programa estas duas variaveis

Package teste;
Public class class1{

public String variavelGlobalUser = "";
public String variavelGlobalPass = "";
}

Abaixo os metodos Get e Sets destas variaveis

......

Na segunda class eu atribui valores as variaveis criadas na class1


public class class2{

....


class1 cc = new class1();
cc.setVariavelGlobalUser("nome_Do_Utilizador");
cc.setVariavelGlobalPass("pass_Do_Utilizador");

System.out.printLn(cc.VariavelGlobalUser) ; // Imprime corectamente o valor de user que atribui acima .
System.out.printLn(cc.VariavelGlobalUser) ; // Imprime corectamente o valor de passque atribui acima .



} 

A terceira class, supostamente seria para utilizar os dados da class1 que foram alterados pela class2


public class class3{

class1 c1 = new class1();

System.out.printLn(c1.VariavelGlobalUser) ; // Imprime vazio .
System.out.printLn(c1.VariavelGlobalUser) ; // Imprime vazio .


}

No fundo o que gostaria que acontecesse era que, apartir de uma class eu pudesse atribuir valores as duas String que estao noutra class, e numa terceira poder imprimir estes valores. Algo do tipo variaveis globais.

Cumprimentos

Olá!

Tente usar o modificador static
Outra coisa… se a variável é public, não faz sentido criar get e set para ela…

Abraços

Não use variáveis globais.
Se você usar, o seu programa começará a ficar instável, a sua mulher vai te deixar e o leite da sua geladeira vai azedar.

 Não use variáveis globais.
Se você usar, o seu programa começará a ficar instável, a sua mulher vai te deixar e o leite da sua geladeira vai azedar.

Por que é que começa a ficar instavel ? alguem me pode dizer ?
O que devo usar entao para manter sempre disponiveis dados que vou precisar usar em todo app ? qual seria a tecnica ? de momento so me veio a cabeça usar variaveis globais.

Voce tem alguma ideia que eu possa implementar para esta necessidade ?

Obrigado pela dica Link_pg, ja alterei para static.

Agradeco ajuda

A minha dúvida é: porque você tem que dividir as classes desse jeito? Tudo poderia ser feito em uma só classe.

Outra coisa é que você não escreveu os métodos dentro das classes. Se for só esse o código que você mandou, não compila.

Evite também dar nomes de classes como class1, class2 e class3. Dê um nome significativo a elas.

As variáveis globais são problema pois algum trecho de código pode modificar a variável de maneira errada e só ser preceptível num outro trecho de código que lê a variável. Por isso, quanto menos escopo a variável pertencer, menores são os trechos de códigos que poderão ler as variáveis.

Imagine que exista uma regra que diga que o User e o Pass não possam ter um tamanho menor que 5. Da maneira como está pode-se atribuir qualquer String de qualquer tamanho as variáveis, nada impede isso, as variáveis são públicas qualquer um tem acesso a elas. Para evitar essa situação, vc tornaria as variáveis privadas, e os seus acessos seriam feitos através de métodos gets e sets públicos que impediriam acessos indevidos às variáveis, e dentro do set por exemplo, poderia existir uma verificação à regra apresentada.

  1. Você perde o controle de onde a sua variável está sendo utilizada;
  2. A falta de encapsulamento faz com que trechos de código afetem outros que não tem nada a ver com o pato (já que todos compartilham o “global”);
  3. Fica difícil prever o impacto das alterações se elas ocorrerem nessa variável;
  4. Fica fácil de um trecho de código alterar a variável para um valor inválido e causar o colapso do sistema.

E teria mais desenas de razões… mas acho que essas já servem.

Isso vale para variáveis… se você estiver falando de constantes globais, aí tudo bem, desde que marcadas com os devidos final.

[quote=LuisClaudio]
O que devo usar entao para manter sempre disponiveis dados que vou precisar usar em todo app ? qual seria a tecnica ? de momento so me veio a cabeça usar variaveis globais.[/quote]

  1. Encapsulamento em classes.
  2. Passar os objetos por parâmetro;
  3. Tem certeza que TODO programa precisa disso?
  4. Padrões de projeto como Registry;

Exato. Você estará saindo do paradigma de programação orientado a objetos, o que não tem sentido.

Se quiser ficar utilizando as suas variáveis de instância para controle, coloque-as como private e trate-a com métodos get e set.

Coloque a validação delas no SET e pronto.

se voce nao usar getters e setters no seu programa voce perdera muito nao conseguira realizar suas aplicacoes usando o total paradigma da POO, ou seja perdera o tão famoso encapsulamento que visa voce mecher nas suas variaveis apenas nas classes que contenham gettters e setter ou chamadas tbm quando falamos em EE de javaBeans. XD

abraços espero ter ajudado!

[quote=shoko]se voce nao usar getters e setters no seu programa voce perdera muito nao conseguira realizar suas aplicacoes usando o total paradigma da POO, ou seja perdera o tão famoso encapsulamento que visa voce mecher nas suas variaveis apenas nas classes que contenham gettters e setter ou chamadas tbm quando falamos em EE de javaBeans. XD
[/quote]

Eu, que sei do que você está falando, quase não consigo entender o que você escreveu. Chegou a reler o texto? Pontuação ajuda!
E onde entra EE e JavaBeans nessa história?

Descontando isso… só a presença de getters e setters também não garante encapsulamento. Pode até encapsular a representação interna, mas não o uso. Considere a classe Semaforo, que tem o atributo cor. Se você criar o método setCor(Cor cor); estará ferindo a classe, já que ela permitiria trocas inválidas de cor. Na melhor das hipóteses, você validaria a troca com exceções, e teria inconvenientes em runtime e duplicação da lógica da troca das cores fora da sua classe. Pior, seria um inferno se a ordem dessas trocas mudasse.

Melhor é, ao invés de um setCor, criar um método chamado trocaCor(), sem parâmetros, que faz a troca automaticamente. Aí não tem duplicação fora da classe. O exemplo que dei é um caso da violação do encapsulamento da lógica da classe, ou melhor, do comportamento.

[quote=shoko]se voce nao usar getters e setters no seu programa voce perdera muito nao conseguira realizar suas aplicacoes usando o total paradigma da POO, ou seja perdera o tão famoso encapsulamento que visa voce mecher nas suas variaveis apenas nas classes que contenham gettters e setter ou chamadas tbm quando falamos em EE de javaBeans. XD

abraços espero ter ajudado![/quote]

Mas getters and setters não tem nada haver com programar usando o total paradigma da POO.

Todo mundo gera getters/setters sem nenhuma necessidade… este padrão surgiu para suprir uma necessidade específica de transferir informações entre tiers diferentes – aonde cada byte é precioso.

http://blog.caelum.com.br/2006/09/14/nao-aprender-oo-getters-e-setters/

Vc pode ter uma interface fluente, sem nenhum getter ou setter, e ainda ter POO

http://gc.blog.br/2008/03/03/um-exemplo-pratico-de-fluent-interface/

ex de codigo:

new EmailMessage() .from("demo@guilhermechapiewski.com") .to("destination@address.com") .withSubject("Fluent Mail API") .withBody("Demo message") .send();

getters / setters podem inclusive acabar com o encapsulamento ! cuidado :wink:

Luis Claudio,

Independentemente da aplição que você postou como exemplo, e atendendo apenas ao seu objetivo, estude sobre o Design Pattern Singleton. A proposta dele é que exista apenas uma instancia de um referido Objeto.

Dessa forma você poderia “compartilhar” os dados dos atributos dessa classe em todos os locais do seu sistema pedindo solicitando apernas a Instancia da classe que já está criada.

Att,

Guilherme Virtuoso

Exatamente… essa é a proposta dele. Ou seja, a proposta não é criar um repositório de variáveis globais.
Além disso, há diversos problemas em se usar Singletons em Java… Tem discussões inteiras sobre isso aqui no GUJ.