Uso de constantes

Olá pessoal.

Gostaria de saber a opinião de vocês quanto ao seguinte:
Em um projeto que tenho participado existe uma arquitetura toda definida onde existem classes utilizadas apenas para constantes. (Não são interfaces de constantes para implementação).
Existe até o caso de criar classe para definir constantes para números.

Ex.:
ClasseNum.UM, ClassNum.CENTO_E_SETENTA_E_CINCO e assim vai.

Eu não acho muito elegante usar este tipo de constante.
P/ tentar aliviar a aparência deste código alguns preferem somar as constantes, tipo:

ClassNum.CEM + ClassNum.SETENTA + ClassNum.CINCO.

Mas na minha opinião o melhor mesmo seria criar alguma DSL e poder escrever algo do tipo:

ClassNum.CENTO.e(ClassNum.DEZ)

Com uma DSL bem definida não seria necessário criar uma constante nova a cada número que tenha que ser adicionado na aplicação.

É isso pessoal, gostaria de saber a opinião de vocês quanto ao que acham que é melhor.

Abraços

Acho estranho a abordagem da sua empresa para constantes!
Tecnicamente, a finalidade da constante é abstrair um valor (que pode mudar) de modo que eu não tenha altera-lo em todos os lugares caso ele mude. Para isso eu defino um nome que represente o meu valor como NOME_DO_ARQUIVO_DE_CONFIGURACAO. Eu posso colocar qualquer valor para essa constante, mas todo mundo vai saber que ela indentifica o nome do arquivo de configuração.

Agora se eu uso uma constante com o nome CENTO_E_CINCO, o que ela representa? O número 105? Se for assim Não faz sentido, pois se eu quiser mudar o valor da constante para 110 ela deixa de representar o meu valor 105!

Acretido que usar uma DSL não resolve o seu problema, que deve ser outro. Provavelmente estão usando constantes de maneira incorreta.

Eu tinha feito pergunta igual a sua a algum tempo … da uma olhada no link abaixo
http://www.guj.com.br/java/244593-constantes-resolvido#1265829

Ter 165 ou ter Constants.CENTO_SESSENTA_CINCO, é exactamente a mesma coisa.

As constantes devem ter nomes lógicos para o que representam e não nomes relativos ao seu valor actual.

[quote=pmlm]Ter 165 ou ter Constants.CENTO_SESSENTA_CINCO, é exactamente a mesma coisa.

As constantes devem ter nomes lógicos para o que representam e não nomes relativos ao seu valor actual.

[/quote]

Realmente concordo muito com o que disse.
Porém é uma regra da empresa a qual não podemos mudar aqui na equipe.
Então eu gostaria de ver qual abordagem acham “menos estranha” dentro deste cenário =P

Eu acho que usar uma classe para constantes com números não é legal, pois podemos ter uma classe gigantesca cheia de números definidos.
Alguns começaram a somar as constantes p/ obter o valor desejado e assim economizar linhas de código na classe de constantes.
Eu achei mais interessante a DSL p/ tornar o código mais dinâmico…

[quote=adolfo_eloy][quote=pmlm]Ter 165 ou ter Constants.CENTO_SESSENTA_CINCO, é exactamente a mesma coisa.

As constantes devem ter nomes lógicos para o que representam e não nomes relativos ao seu valor actual.

[/quote]

Realmente concordo muito com o que disse.
Porém é uma regra da empresa a qual não podemos mudar aqui na equipe.
Então eu gostaria de ver qual abordagem acham “menos estranha” dentro deste cenário =P

Eu acho que usar uma classe para constantes com números não é legal, pois podemos ter uma classe gigantesca cheia de números definidos.
Alguns começaram a somar as constantes p/ obter o valor desejado e assim economizar linhas de código na classe de constantes.
Eu achei mais interessante a DSL p/ tornar o código mais dinâmico…

[/quote]

Nesse caso acredito que uma DSL faça mais sentido mesmo já que vocês estão usando constantes indevidamente! Com certeza faria mais sentido que o uso que vocês estão fazendo agora.

Bizarrice!! rsrs

Trabalhei em um projeto em que se fazia exatamente isso. O motivo é que o cliente usava checkstyle, e entre as verificações que ele fazia estava a proibição de valores literais no código (magic numbers), ou seja, era obrigado a usar constantes sempre.

Aí o pessoal, por uma mistura de desinformação e preguiça começou a burlar a regra usando constantes UM, DOIS, TRES, CENTO_E_SETENTA_E_CINCO, etc.

Como os colegas bem disseram aí em cima, defina as constantes pelo seu significado e não pelo valor, porque desse jeito é a mesma coisa que não ter. Tente trabalhar essa questão aí com sua equipe, pode ser que só esteja assim porque ninguém quis ter o trabalho de “levantar a bunda da cadeira” para questionar.

Boa tarde a todos.

Você também deve ter o cuidado de se ficar criando constantes demais na sua aplicação.

Constantes no java geralmente são declaradas como estáticas e final e assim como métodos estáticos, mesmo sendo declarados em uma classe específica, são alocados em memória tão logo a aplicação se inicia, e só são retirados de lá tão logo a aplicação se fecha.

Estou com a maioria aqui, pois constantes só devem ser declaradas para valores imutáveis, afinal porque que as mesmas levam esse nome de Constantes, e também com valores que definam o seu nome, como por exemplo: O valor de PI que é igual a 3,14161816…, todos sabem que este valor sempre será o mesmo para PI, então você pegar um número aproximado desta dízima e defini-la com o nome PI. Outro exemplo para constantes é criar valores númericos para opção de Menu, exemplo:

public class MinhaClasse {
    ....
    public static int STATUS = 0;

    public static final int INSERIR = 1;
    public static final int ATUALIZAR = 2;
    public static final int APAGAR = 3;
    ....
    .....
    .....
}

public class OutraClasse {
    ..... 
    MinhaClasse.STATUS = MinhaClasse.INSERIR;
    .....
    .....
    switch (MinhaClasse.STATUS)
         case MinhaClasse.INSERIR: ........ ;break;
         case MinhaClasse.ATUALIZAR ..... ;break;
         case MinhaClasse.APAGAR ..... ;break;
    }
}

Assim como já foi dito, não faz sentido voce somar 165 + 5, ou somar MinhaClasse.CENTO_SESSENTA_CINCO + MinhaClasse.CINCO, qual das sentenças seria mais fácil digitar :?: :?: :?:

Um abraço.