Galera estou tentando implementar um exercício com base em MVC para controlar CDs aqui mas to tendo uma dificuldade.
Tenho 3 classes: Controlador, CD e Program. Todas classes são public. A classe Program está assim:
static void main(){}
static void TelaAddCD() {}
A dúvida é: não consigo utilizar uma instância de “Controlador” na classe Program(), de forma que possa usar para fazer o controle do sistema. Se criar a instância dentro do método main, ela não é visivel dentro do método TelaAddCDs(), tentei tb criar como atributo da classe Program, mas fica sem visibilidade tb. O que fazer pra resolver?
Métodos static referem-se a classe, porém não consigo entender a relação entre o método static e minha instância. Poderia dar uma dica?
Acho que neste caso está em questão a visibilidade das variáveis, ou seja, se criar dentro do método será visivel apenas pro próprio método. Agora pq quando crio como atributo da classe Program, não consigo acessar dentro de nenhum método?
public teste(){
testar = new teste1();
}
public static void main(String[] args){
System.out.println("Classe teste atendeu...");
teste app = new teste();
}
}[/code]
[code]public class teste1{
public teste1(){
System.out.println("Classe teste1 atendeu...");
}
}[/code]
SAÍDA:[quote]C:\Users\Vingdel\Desktop>java teste
Classe teste atendeu…
Classe teste1 atendeu…[/quote]
Metodos estaticos nao podem ter instancias de classes não estáticas em seu corpo. Basicamente é esse o problema. Cuidado na hora de usar static pois nem sempre é vantajoso.
edit: outro caso que pode valer a pena usar estaticos, MAS VARIAVEIS, sao os casos que voce precisa de uma variavel compartilhada entre as varias instancias de uma classe. Esse é um exemplo de bom uso para static.
Mas repetindo: use estaticos com cuidado: pode ser uma tentaçao, ja que nao é preciso instanciar, mas por outro lado pode ser muito perigoso. Isso sem contar que voce “perde em OO” já que nao vai poder usar variaveis de instancia em metodos estaticos e se fizer isso sem lembrar que o metodo era estatico - o que nao é incomum ja que estamos acostumados a supor OO em tudo - voce pode ter resultados indesejados.
Vingdel agora tente acessar o objeto app dentrou de outro método static na classe teste. Meu problema está na visibilidade do objeto entre os métodos static.
carlos.e.a acredito que esteja equivocado, métodos estáticos podem ter instâncias em seus corpos. Estou usando static na minha classe Program, pois trata-se da Interface do sistema, ou seja, vou apenas configurar telas diferentes em cada método, para solicitar dados ao usuário.
[quote=gRoOve]Vingdel agora tente acessar o objeto app dentrou de outro método static na classe teste. Meu problema está na visibilidade do objeto entre os métodos static.
carlos.e.a acredito que esteja equivocado, métodos estáticos podem ter instâncias em seus corpos. Estou usando static na minha classe Program, pois trata-se da Interface do sistema, ou seja, vou apenas configurar telas diferentes em cada método, para solicitar dados ao usuário.[/quote]
edit: é, acabei de fazer uns testes aqui e realmente da pra instanciar. Estranho, acho que devo ter entendido esse artigo de forma muito errada xD
Cara, pensando aqui finalmente eu entendi o teu problema. Realmente eu tava viajando. É assim, voce tah tentando acessar uma instancia de classe em um metodo estatico. Realmente isso não é possivel. Foi o que eu falei antes, voce tah caindo justamente no problema de tratar metodo estatico com OO. Tu nao pode fazer referencias a variaveis de instancia - entenda como globais - em metodos estaticos. Vou ser mais pratico pra voce entender: Suponha que voce crie outra instancia da classe program, ok? Ai quando voce for chamar os metodos estaticos como eles vao saber qual das duas variaveis de instancia voce ta querendo usar? Pode parecer obvio que seria a variavel da instancia que chamou o metodo. MAS isso seria obvio somente para metodos nao estaticos. Para metodos estaticos isso nao é tao obvio ja que voce só tem uma referencia a ele para todos os objetos. A regra basica é que se voce pretende modificar variaveis de instancia dentro de um metodo, nao use o metodo como estatico. Foi o que eu quis dizer quando falei que estaticos sao perigosos.
Cara, eu entendi isso. Mas olha só, meu professor crio os diagramas de classes para este sistema, e na classe Program, todos métodos são estáticos. Como posso resolver isso então? Preciso ter uma instância de Controlador dentro da classe Program, afim de controlar todo o sistema.
Ps.: Se eu criar uma instância de Controlador dentro do método main(), consigo trabalhar sem problemas com ela, mas SOMENTE dentro de main. Se tento acessar em outro método estático, o objeto referenciado por uma variável declarada dentro do método main, não é possível, não fica visível.
Sim, exato, se você cria a instância dentro do método main só fica visível dentro do método main, para que você possa acessar em outros métodos tem que ser uma instância criada na classe. Não sei se entendi bem o problema, mas tem que ver sobre escopo de variáveis.
Caso eu não esteja sendo coerente na resposta me mostre um exemplo.
Abraço!
[quote=gRoOve]Cara, eu entendi isso. Mas olha só, meu professor crio os diagramas de classes para este sistema, e na classe Program, todos métodos são estáticos. Como posso resolver isso então? Preciso ter uma instância de Controlador dentro da classe Program, afim de controlar todo o sistema.
Ps.: Se eu criar uma instância de Controlador dentro do método main(), consigo trabalhar sem problemas com ela, mas SOMENTE dentro de main. Se tento acessar em outro método estático, o objeto referenciado por uma variável declarada dentro do método main, não é possível, não fica visível.[/quote]
[quote=gRoOve]Cara, eu entendi isso. Mas olha só, meu professor crio os diagramas de classes para este sistema, e na classe Program, todos métodos são estáticos. Como posso resolver isso então? Preciso ter uma instância de Controlador dentro da classe Program, afim de controlar todo o sistema.
Ps.: Se eu criar uma instância de Controlador dentro do método main(), consigo trabalhar sem problemas com ela, mas SOMENTE dentro de main. Se tento acessar em outro método estático, o objeto referenciado por uma variável declarada dentro do método main, não é possível, não fica visível.[/quote]
O que voce pode fazer nesse caso é ir repassando o objeto controlador para os metodos, como um argumento. Mas nao acho que isso seja uma boa pratica, o ideal seria tirar esse static, mas se ele exigiu desse jeito né…Agora se ele quer que a assinatura do metodo seja exatamente essa ai - ou seja, sem argumentos - eu desconheço uma forma de voce fazer isso.
Mas se esse é um exercicio de MVC isso nao deveria ser uma coisa a se preocupar. Nao acho legal voce amarrar a assinatura de um metodo em um exercicio. É como exigir que outra pessoa pense exatamente como voce pensou.
Sim, exato, se você cria a instância dentro do método main só fica visível dentro do método main, para que você possa acessar em outros métodos tem que ser uma instância criada na classe. Não sei se entendi bem o problema, mas tem que ver sobre escopo de variáveis.
Caso eu não esteja sendo coerente na resposta me mostre um exemplo.
Abraço!
[quote=gRoOve]Cara, eu entendi isso. Mas olha só, meu professor crio os diagramas de classes para este sistema, e na classe Program, todos métodos são estáticos. Como posso resolver isso então? Preciso ter uma instância de Controlador dentro da classe Program, afim de controlar todo o sistema.
Ps.: Se eu criar uma instância de Controlador dentro do método main(), consigo trabalhar sem problemas com ela, mas SOMENTE dentro de main. Se tento acessar em outro método estático, o objeto referenciado por uma variável declarada dentro do método main, não é possível, não fica visível.[/quote][/quote]
Tentei fazer assim tb, criar a instância como atributo da classe Program, porém não consigo acessar em nenhum método =((
Eu sei que deve-se evitar o uso do static, mas o professor passou as classes assim, e agora fiquei curioso pq não funciona…não consigo entender realmente…
Acho que vou ter q esperar minha próxima aula e falar com ele, hehe. Vlw pela ajuda ai
[quote=gRoOve]Galera estou tentando implementar um exercício com base em MVC para controlar CDs aqui mas to tendo uma dificuldade.
Tenho 3 classes: Controlador, CD e Program. Todas classes são public. A classe Program está assim:
static void main(){}
static void TelaAddCD() {}
A dúvida é: não consigo utilizar uma instância de “Controlador” na classe Program(), de forma que possa usar para fazer o controle do sistema. Se criar a instância dentro do método main, ela não é visivel dentro do método TelaAddCDs(), tentei tb criar como atributo da classe Program, mas fica sem visibilidade tb. O que fazer pra resolver?[/quote]
Sua dúvida está me parecendo mais ao usar “escopo”: