Recentemente, notei que há uma opção para ter métodos estáticos nas interfaces. Assim como nos campos estáticos da interface, há um comportamento interessante: eles não são herdados.
Não tenho certeza se é útil nas interfaces reais a serem implementadas. No entanto, ele permite que o programador crie interfaces que são apenas envelopes para coisas estáticas, como, por exemplo, as classes utilitárias.
Um exemplo simples é apenas um envelope para constantes globais. Comparado a uma classe, você pode observar facilmente o padrão que está faltando, public static final
como eles são assumidos (tornando-o menos detalhado).
public interface Constants {
String LOG_MESSAGE_FAILURE = "I took an arrow to the knee.";
int DEFAULT_TIMEOUT_MS = 30;
}
Você também pode tornar algo mais complexo, como esse pseudo-enum de chaves de configuração.
public interface ConfigKeys {
static createValues(ConfigKey<?>... values) {
return Collections.unmodifiableSet(new HashSet(Arrays.asList(values)));
}
static ConfigKey<T> key(Class<T> clazz) {
return new ConfigKey<>(clazz);
}
class ConfigKey<T> {
private final Class<T> type;
private ConfigKey(Class<T> type) {
this.type = type;
}
private Class<T> getType() {
return type;
}
}
}
import static ConfigKeys.*;
public interface MyAppConfigKeys {
ConfigKey<Boolean> TEST_MODE = key(Boolean.class);
ConfigKey<String> COMPANY_NAME = key(String.class);
Set<ConfigKey<?>> VALUES = createValues(TEST_MODE, COMPANY_VALUE);
static values() {
return VALUES;
}
}
Você também pode criar alguma "classe" de utilidade dessa maneira. No entanto, em utilitários, geralmente é útil usar métodos auxiliares privados ou protegidos, o que não é bem possível nas classes.
Considero um novo recurso interessante e, principalmente, o fato de os membros estáticos não serem herdados é um conceito interessante que foi introduzido apenas nas interfaces.
Gostaria de saber se você pode considerá-lo uma boa prática. Embora o estilo de código e as práticas recomendadas não sejam axiomáticas e haja espaço para opinião, acho que geralmente existem razões válidas para apoiar a opinião.
Estou mais interessado nas razões (não) para usar padrões como esses dois.
Observe que não pretendo implementar essas interfaces. Eles são apenas um envelope para o seu conteúdo estático. Pretendo apenas usar constantes ou métodos e possivelmente usar importação estática.
default
métodos. Eu estou falando sobre static
métodos e campos. Como não são herdadas, não quebram a herança múltipla.