Variavel global

Boa noite, tem como criar uma “variavel global” podendo ser enchergada por todas as classes? Porque preciso que um JSP use uma classe para montar um grafico(<jsp:useBean id=“graficoDS” class=“Grafico”/>), porém não sei como passar um parametro para classe informando por exemplo quais são os dados a serem recuperados. Se alguem poder ajudar agradeço.

Olá!

Uma saída é vc criar uma variável estática em uma das suas classes (ai vai depender da estrutura de classes do seu programa). Com uma variável estática não é necessário criar um novo objeto, vc pode chamar a variável diretamente a partir do nome da classe. Só que este deve ser um valor CONSTANTE, vc não poder alterar este valor…

Ei ! Alto lá !

Uma variável estática pode ser, sim, alterada !
Uma variável final é que não pode.

Voltando ao posto inicial, NÃO use uma global. É indicação de problemas de design.

Se os parâmetros para o gráfico vierem no request, então problema é pior ainda: é um erro grave usar globais neste caso, pois haverá a possibilidade de dados de um request sobreporem o de outro e, no final, os gráficos sairem trocados ou iguais para dois usuários simultâneos.

Algumas alternativas:

  1. Se seu gráfico for fixo, ou seja, não depende de parâmetros e/ou do usuário corrente, vc pode utilizar o ServletContext para armazená-lo.

  2. Se sua classe Grafico precisa de parâmetros e vc. não quer usar um servlet (seria o mais indicado neste caso !) use o useBean e jsp:setProperty para passar os parâmetros. Em seguida, use o getProperty para “pegar” o gráfico.

[quote=psevestre]Ei ! Alto lá !

Uma variável estática pode ser, sim, alterada !
Uma variável final é que não pode.

Voltando ao posto inicial, NÃO use uma global. É indicação de problemas de design.

Se os parâmetros para o gráfico vierem no request, então problema é pior ainda: é um erro grave usar globais neste caso, pois haverá a possibilidade de dados de um request sobreporem o de outro e, no final, os gráficos sairem trocados ou iguais para dois usuários simultâneos.

Algumas alternativas:

  1. Se seu gráfico for fixo, ou seja, não depende de parâmetros e/ou do usuário corrente, vc pode utilizar o ServletContext para armazená-lo.

  2. Se sua classe Grafico precisa de parâmetros e vc. não quer usar um servlet (seria o mais indicado neste caso !) use o useBean e jsp:setProperty para passar os parâmetros. Em seguida, use o getProperty para “pegar” o gráfico.

[/quote]

Olá!

Poderia me dar um exemplo?

Obrigado!

psevestre, o gráfico seria mais a opção 2 da sua resposta. ex

Estou usando MVC, Em um jsp o usuário escolhe qual dado quer consultar, no “controller” eu recupero esse dado através do request e (seria aqui o local para definir a consulta a ser feita) chamo outro JSP responsável por char o grafico (<useBean id=""…>). Obs.: estou usando CEWOLF.

Sou iniciante em Java se puderem me dar um exemplo agradeço.

[quote=cassio][
Olá!

Poderia me dar um exemplo?

Obrigado![/quote]

Exemplo do quê ? De static sendo alterada ?

package guj.teste;

public class GlobalMutante {

           static int global = 0;

           public static void main(String[]args ) {

                      GlobalMutante g = new GlobalMutante();
                        g.global++;
                        System.out.println(g.global);
           }
}

[quote=psevestre][quote=cassio][
Olá!

Poderia me dar um exemplo?

Obrigado![/quote]

Exemplo do quê ? De static sendo alterada ?

package guj.teste;

public class GlobalMutante {

           static int global = 0;

           public static void main(String[]args ) {

                      GlobalMutante g = new GlobalMutante();
                        g.global++;
                        System.out.println(g.global);
           }
}

[/quote]

Ahaaa!! Sabia que vc iria fazer isso… Claro q se vc alocar um objeto da classe vc pode alterar seu atributo estático sem problemas! O que eu quis dizer foi se ele criasse uma classe com algumas variáveis estáticas para serem usadas como constantes globais, enxergadas por todas as classes… Se não há alocação de memória, não tem como vc alterar o valor neste caso… Mas usar variável como se fosse global da maneira que vc colocou, na mesma classe onde está o main é diferente…

[quote=cassio][
Ahaaa!! Sabia que vc iria fazer isso… Claro q se vc alocar um objeto da classe vc pode alterar seu atributo estático sem problemas! O que eu quis dizer foi se ele criasse uma classe com algumas variáveis estáticas para serem usadas como constantes globais, enxergadas por todas as classes… Se não há alocação de memória, não tem como vc alterar o valor neste caso… Mas usar variável como se fosse global da maneira que vc colocou, na mesma classe onde está o main é diferente…
[/quote]

Faça o teste vc mesmo:

GlobalMutante.java

package guj.teste;

 public class GlobalMutante {

            public static int global = 0;
 }

GlobalMutator.java:

package guj.teste;

public class GlobalMutator {



            public static void main(String[]args ) {

                       GlobalMutante.global++;
                       System.out.println("valor: " + GlobalMutante.global);
            }

}

O resultado da execução de GlobalMutator será 1.

Bem, em POO nao é prudente falarmos em variaveis globais. Mas podemos utilizadar um pattern chamado singleton para sermos mais puristas ao paradigma de POO.

Espero ter ajudado,

Nadilson

[quote=cassio]
Ahaaa!! Sabia que vc iria fazer isso… Claro q se vc alocar um objeto da classe vc pode alterar seu atributo estático sem problemas! O que eu quis dizer foi se ele criasse uma classe com algumas variáveis estáticas para serem usadas como constantes globais, enxergadas por todas as classes… Se não há alocação de memória, não tem como vc alterar o valor neste caso… Mas usar variável como se fosse global da maneira que vc colocou, na mesma classe onde está o main é diferente…[/quote]

Você está confundindo constantes com membros estáticos. De qualquer forma, não pense em “Se não há alocação de memória, não tem como vc alterar o valor neste caso” em Java porque o buraco é mais embaixo. Pra começas a classe em si já é um objeto assim que carregada, então haveria ‘alocação’ ;), mas num ambiente de memória gerenciada como uma JVM afirmações como esta são suposições sobre o que a JVM está fazendo. EM caso de dúvidas o melhor é consultar a especificação da linguagem.

Mesmo em programação procedural globais são sinal de mau design. De qualquer forma, um SIngleton não deve ser utilizado para variáveis globais, o padrão tem outro fim e é muito raro haver necessidade do seu uso.

Deve-se eliminar a necessidade de uma variável global em primeiro lugar, pois este é o problema.

No caso me parece que o tonemi precisa entender melhor o paradigma HTTP de request/response/session.