Gostaria de saber se é uma boa prática de programação criar uma interface que defina apenas constantes e fazer com que uma classe que precise compartilhar alguma constante simplesmente implemente a interface… Não lembro onde li que variáveis globais são práticas totalmente procedurais… Se são mesmo como posso compartilhar informações (constantes, no caso) que são comuns à muitas classes?
Primeiro:se você fizer uma classe que só precise de um subconjunto das constantes definidas na interface, sua classe estaria recebendo mais constantes do que realmente precisa…
Segundo: visto que os atributos de interface já são public static final, você não precisaria de nada adicional para que as classes compartilhassem das constantes… você já poderia acessa-las diretamente através de NomeInterface.suaConstante.
Por final, acho que se vc quiser compartilhar constantes, vc pode criar uma classe abstrata que contenha todas as constantes que devem ser compartilhadas pelo sistema.
Eu tô de férias e to fazendo um jogo de truco… quero fazer o mais OO possível, por isso essas duvídas… Quanto as constantes, eu queria definir algumas do tipo: String DELIMITADOR = " > ", int NUM_CARTAS_MAO = 3… algumas desse tipo pra não precisar ficar repetindo código e outras pra alguns switch (pra não precisar ficar escrevendo número usa a costante na hora de passar o argumento) dai pensei em centrar tudo numa interface… mas pelo que vi isso não é muito OO.
ariáveis globais são ruins em qualquer paradigma. Não importa uma interface só apra ter constantes, use static imports ou simplesmente ConstantesParsing.DELIMITADOR mesmo.
Quantoa switches, se você quer algo OO comece esquecendo switches. Substitua-os (quase sempre) por polimorfismo.
Você acaba de descrever o “constant interface” anti-pattern.
Procure sobre esse tema no Google e você vai achar diversos sites, blogs e fóruns explicando o por que é tão ruim fazer isso.
O “constant interface anti-pattern”, que o VinyGodoi citou, diz que usar interfaces apenas para guardas constantes é ruim por que permite casos como esse:
[code]public interface Constantes {
public static final int MINHA_CONSTANTE = 1;
}
public class MinhaClasseQualquer implements Constantes {
…??
}[/code]
Apesar de não ter nada de errado, fica bem estranho.
Tem vários motivos para não usar esse tipo de estratégia, como já citaram, mas se você vai mesmo usar, um jeito melhor é fazer:
[code]public final class Constantes {
public static final int MINHA_CONSTANTE = 1;
private Constantes() { }
}
[/code]
Não tenho certeza, mas acho que isso é dica do livro Effective Java.
De qualquer modo, hoje em dia é melhor aprender e começar enums mesmo pra isso.