¿Es una mala práctica tener una interfaz para definir constantes?

40

Estoy escribiendo un conjunto de clases de prueba junit en Java. Hay varias constantes, por ejemplo, cadenas que necesitaré en diferentes clases de prueba. Estoy pensando en una interfaz que los define y cada clase de prueba lo implementaría.

Los beneficios que veo son:

  • acceso fácil a las constantes: MY_CONSTANT en lugar de ThatClass.MY_CONSTANT
  • cada constante se define solo una vez

¿Este enfoque es una práctica buena o mala? Tengo ganas de abusar un poco del concepto de interfaces.

Puede responder en general sobre interfaces / constantes, pero también sobre pruebas de unidad si hay algo especial en ello.

    
pregunta FabianB 19.02.2011 - 02:55

7 respuestas

75

Joshua Bloch desaconseja esto en su libro Java efectivo :

  

Que una clase use algunas constantes internamente es un detalle de implementación. La implementación de una interfaz constante hace que este detalle de implementación se filtre en las clases de API exportadas. No es importante para los usuarios de una clase que la clase implemente una interfaz constante. De hecho, incluso puede confundirlos. Lo que es peor, representa un compromiso: si en una versión futura la clase se modifica para que ya no necesite usar las constantes, todavía debe implementar la interfaz para garantizar la compatibilidad binaria.

Puedes obtener el mismo efecto con una clase normal que define las constantes y luego usar import static com.example.Constants.*;

    
respondido por el matt 19.02.2011 - 04:04
11

En nuestro caso, estamos haciendo esto porque los valores de las constantes representan un contrato para los estados finales que una implementación de servicio debe proporcionar. Poner estas constantes en la interfaz especifica los estados finales como parte del contrato, y si alguna implementación de la interfaz no los utilizara, no estaría haciendo su trabajo.

Las constantes de ALGUNAS VECES son detalles de implementación. A VECES, no lo son. Como de costumbre, un ingeniero necesita usar su cerebro para decidir qué hacer y no confiar en un patrón o práctica de barrido.

    
respondido por el user144901 01.08.2014 - 17:02
7

No creo que sea bueno tener interfaces solo para las constantes.

Pero si una interfaz que define el comportamiento (los métodos que implementan las clases deberían implementarse) tiene constantes, está bien. Si "filtra algunos detalles del implementador" en la API, es porque debe ser así. También tienen fugas de que el implementador implementa los métodos foo y bar.

Tomemos, por ejemplo, la interfaz java.awt.Transparency. Tiene constantes OPAQUE, BITMASK y TRANSLUCENT, pero también tiene el método getTransparency ().

Si el diseñador coloca esas constantes es porque pensó que sería lo suficientemente estable como para formar parte de la interfaz, como es getTransparency ().

    
respondido por el Tulains Córdova 01.08.2014 - 18:22
2

Piensa que es un punto de vista principalmente popular en lugares donde el diseño por contrato prevalece.
 Las interfaces son contratos. Colocar constantes en las interfaces significa que cada clase que cumple con el contrato está de acuerdo con el valor / concepto identificado por la constante.

    
respondido por el CMR 19.02.2011 - 03:18
2

Una empresa en la que trabajé hizo un uso intensivo de las constantes 1 importadas por interfaz. No siento ningún daño por ello.

La pregunta que deberías hacerte es: ¿qué importancia tiene el espacio de nombre para ti? En el caso de las constantes, en realidad todo es como actúa una clase. Si tiene miles de constantes, es posible que no desee que todas esas constantes estén siempre disponibles.

Lo bueno de las interfaces es que le brinda la ventaja de trabajar de cualquier manera: incluya todos los espacios de nombres que necesita, o ninguno de ellos (y acceda a ellos explícitamente, con MyInterface.CONSTANT ). Casi lo mismo que import static MyInterface.* , pero un poco más obvio.

1: si no estás familiarizado con Java, no me refiero a la palabra clave import , solo me refiero a través de implements MyConstantsInterface

    
respondido por el Nicole 19.02.2011 - 03:04
1

Vengo de un fondo que está principalmente influenciado principalmente por la 'forma Ada' y la 'forma Net.' Yo diría que no, que probablemente no es mejor declarar constantes dentro de las interfaces. Técnicamente no está permitido en c #.

La razón por la que digo que no es que una interfaz es una forma de contrato que define el comportamiento, no el estado o la estructura. Una constante implica algún tipo de estado (primitivo), o un aspecto del estado (compuesto o agregado).

Puedo apreciar la necesidad de que los valores predeterminados y los valores predefinidos estén disponibles para todos los que implementan la interfaz, pero tal vez el estado predeterminado se describiría mejor en un objeto o plantilla abstracta o de valor, donde los valores predeterminados tendrían al menos un contexto mínimo.

Para una guía más técnica: download.oracle.com/javase/1.5.0/docs/guide/language/static-import.html

    
respondido por el JustinC 19.02.2011 - 04:12
0

No, no es una mala práctica en general.

El punto es que las constantes como cualquier otro artefacto deben introducirse bajo las reglas de visibilidad mínima y nivel de abstracción adecuado.

Usar la sintaxis solo porque puedes es el problema real.

    
respondido por el oopexpert 01.06.2017 - 12:54

Lea otras preguntas en las etiquetas