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.
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.
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.
Você perde o controle de onde a sua variável está sendo utilizada;
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”);
Fica difícil prever o impacto das alterações se elas ocorrerem nessa variável;
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]
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=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.
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
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.
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.