Constantes [RESOLVIDO]

Pessoal,

Eu sei que declarar classes com constantes globais é pessima pratica, o correto é ter interfaces para ter as constantes correto ?

eu vi que aqui na empresa tem muitas classes com constates globais, dai surgiu a seguinte duvida… É só pessima pratica mesmo tem algum problema com performance eu gostaria de saber pra ver se consigo aprovar um refactory disso.

Obrigado a todos

Cara, se a constante estiver de acordo com o propósito da classe não vejo muito problema não… Por exemplo Math.PI. O que não dá é ter na classe User uma constante HIBERNATE_POOL = 3, por exemplo. Isso é totalmente sem sentido. Quanto a questão de onde criar as constantes, a interface também não foi feita para isso. Não faz sentido a frase “agora vou implementar a constante XPTO”… Muita gente faz por questão de conveniência, mas eu pessoalmente acho uma má prática. Para mim constantes ou são enums ou entradas em arquivos de propriedades ou definições dentro do próprio sistema, num módulo “admin”.

entendi… aqui na empresa é usado algo assim… nome da classe NomeDoModuloUtils e no corpo dessa classe todas as constantes

Você está confundindo variáveis globais com constantes. O grande problema de se colocar tudo como variável global é que todo mundo mete o dedo ali. Imagina isso num ambiente multithread. Não vejo problema em deixar contantes numa classe ‘aberta’. Se você usar public, static e final, pode fazer sentido.

O que o Fabio C Silva falou faz muito sentido. Deixar em arquivos é interessante, mas prefiro deixar na classe mesmo (dá pra separar por módulos e fica mais fácil de acessar via código). Só não concordo muito com a parte de Enums. Acho o propósito de Enum muito maior do que guardar um valor. Se você precisar de uma constante pra uma coisa em comum (por exemplo, status de alguma coisa - você precisa saber da letra e do significado dela (“A” e “Ativo”)) acho bem interessante usar Enums.

De qualqeur forma, é uma questão de opinião e gosto.

[editado]
Nao tinha visto sua resposta, Vitor. Me desculpe.

Oi Vitor,
Vocês usaram classe ou interface?

Como fizeram a implementação? tem um exemplo?

[quote=Andre Brito]Você está confundindo variáveis globais com constantes. O grande problema de se colocar tudo como variável global é que todo mundo mete o dedo ali. Imagina isso num ambiente multithread. Não vejo problema em deixar contantes numa classe ‘aberta’. Se você usar public, static e final, pode fazer sentido.

O que o Fabio C Silva falou faz muito sentido. Deixar em arquivos é interessante, mas prefiro deixar na classe mesmo (dá pra separar por módulos e fica mais fácil de acessar via código). Só não concordo muito com a parte de Enums. Acho o propósito de Enum muito maior do que guardar um valor. Se você precisar de uma constante pra uma coisa em comum (por exemplo, status de alguma coisa - você precisa saber da letra e do significado dela (“A” e “Ativo”)) acho bem interessante usar Enums.

De qualqeur forma, é uma questão de opinião e gosto.

[editado]
Nao tinha visto sua resposta, Vitor. Me desculpe.[/quote]

André, quanto a questão dos enums, acho que eles são uma maneira poderosa de definir constantes porque você abstrai o valor e se preocupa com a lógica. Por exemplo:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
}

public class Calendar{
public Day firstDayOfWeek = Day.MONDAY;
}

Esse é um código bastante inteligível. Além disso você pode usar o chamado “corpo de classe específico de constante” e definir comportamentos específicos para cada dia, o que permite uma utilização interessante de polimorfismo. Este também é um exemplo de utilização coerente de constante em classe, na minha opinião.

Obrigado a todos pelas respostas. Realmente em principio tava confundindo constantes globais com variaveis globais… :oops:

juceliohv é ± assim


public class Configurações {

        public static final String CONFIG_1 = "1";
        ...
}

Tem razão, fica bastante inteligível. Se eu quiser coloca o extenso (“Segunda-feira”, “Terça-feira”, …), fica bem fácil.

É aí o ponto. Enum, na minha opinião, é muito mais poderoso do que somente usar constante. Por exemplo, o código da Math:

[code]/**

  • The double value that is closer than any other to
  • e, the base of the natural logarithms.
    */
    public static final double E = 2.7182818284590452354;

/**

  • The double value that is closer than any other to
  • pi, the ratio of the circumference of a circle to its
  • diameter.
    */
    public static final double PI = 3.14159265358979323846;
    [/code]
    Na sua opinião, faz sentido usar Enum?

Tem razão, fica bastante inteligível. Se eu quiser coloca o extenso (“Segunda-feira”, “Terça-feira”, …), fica bem fácil.

É aí o ponto. Enum, na minha opinião, é muito mais poderoso do que somente usar constante. Por exemplo, o código da Math:

[code]/**

  • The double value that is closer than any other to
  • e, the base of the natural logarithms.
    */
    public static final double E = 2.7182818284590452354;

/**

  • The double value that is closer than any other to
  • pi, the ratio of the circumference of a circle to its
  • diameter.
    */
    public static final double PI = 3.14159265358979323846;
    [/code]

Na sua opinião, faz sentido usar Enum?[/quote]

Nesse caso que você citou realmente faz mais sentido definir um valor ao invés de usar enum. Depende do problema a forma mais coerente de fazer…