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.
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”.
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=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.