creo que el uso de una interfaz para las constantes compartidos es un ejemplo de confundir dos conceptos diferentes:
- la reutilización de código
- Subtipificación
En mi experiencia en el uso de subclases, o interfaz de la aplicación, simplemente para evitar la duplicación de código conduce a problemas. Tu código se vuelve más frágil. Por ejemplo, alguien podría redefinir accidentalmente la constante, especialmente si su jerarquía de clases tiene varias clases de profundidad.
A menudo es mejor usar la composición para mantener su código SECO.
Otro problema con el uso de herencia de esta manera es que generalmente este tipo de herencia forma parte de la API de su clase. La jerarquía de la clase es visible fuera de la clase. Esto rompe la encapsulación.No es necesario que expongas tu uso de las constantes fuera de la clase, tienen que ver con cómo has elegido implementar tu clase y no son parte de su API (en tu ejemplo).
Esto puede provocar problemas de compatibilidad con versiones anteriores. Otra persona podría venir y escribir código como este:
public interface Constants {
static final int CONST = 2;
}
public class MyClass implements Constants {
int doSomething(int input) {
return CONST * input;
}
}
public class ThirdPartyClass {
int doSomethingElse(int input) {
return MyClass.CONST + input;
}
}
Ahora, si usted decide que ya no necesita utilizar CONST en MiClase está atascado. Porque ThirdPartyClass ha creado una dependencia en CONST estando disponible en MyClass.
Puede terminar con esto. Donde MyClass no está utilizando ninguna de las constantes en la interfaz, pero aún tiene que implementarlo.
public interface Constants {
static final int CONST = 2;
}
public class MyClass implements Constants {
int doSomething(int input) {
return input;
}
}
public class ThirdPartyClass {
int doSomethingElse(int input) {
return MyClass.CONST + input;
}
}
En resumen; nunca hagas esto!
(+1), no lo está simulando por completo, porque no funciona para las importaciones estáticas de los métodos – Bozho
En realidad, también hay una lógica circular en este argumento. No heredamos clases constantes solamente porque puede usar importaciones estáticas. ¿Pero por qué deberíamos usar importaciones estáticas dado que podemos heredar la interfaz? Incluso llamarlo un "truco" sin decir por qué se considera un "truco" es como repetir el mantra del "estilo malo". –
La diferencia es que las importaciones estáticas son una característica del lenguaje introducida específicamente para permitir esto, mientras que el propósito de las interfaces es bastante diferente; por lo tanto, usar una interfaz como esta es un truco; Pensé que era evidente. –