contrato del tipo (clase, interfaz de enumeración) es el, así, el contrato este tipo se compromete a cumplir.Establece:
- cuáles son los parámetros aceptables para el constructor y/o los métodos de este tipo;
- lo que debe y/o no debe esperar que este tipo esté haciendo. Por ejemplo, puede indicar que debe esperar que esta clase sea segura para subprocesos o que no sea segura para subprocesos;
- qué son invariantes compatibles con este tipo. Por ejemplo, escriba el método
addData(float)
de la clase MathAverage
, que calcula el promedio de su entrada, y puede indicar que cada vez que devuelve su llamada al add(float)
, debe esperar que la llamada al MathAverage.getAverage()
devuelva el promedio correcto de la entrada actual.
- en general, su tipo puede especificar cualquier restricción que todos sus subtipos deben seguir. Por ejemplo, puede decir "ningún método de este tipo debe tardar más de 1 segundo en ejecutarse".
Contrato se especifica en forma libre en javadoc de tipo. Existen algunas herramientas/prácticas para hacer cumplir la ejecución de contratos, pero son limitadas, exactamente porque el contrato puede ser arbitrario, o incluso contradictorio, en caso de error del programador.
Dado que la subtipificación (subclases) puede extender/modificar el comportamiento de los métodos de supertipo de manera arbitraria, también puede violar algunas partes del contrato de supertipo. Ejemplo de esto sería extender HashMap
, que acepta null
valores y claves, con alguna implementación que prohíbe los valores null
en las llamadas a sus métodos.
Otro aspecto importante sobre el tipo de contrato es que el subtipo puede tener fuerte contrato (que abarca subconjunto de las restricciones en el contrato del tipo), pero no puede tener más débil contrato (que abarca superconjunto de las restricciones en el contrato del tipo). Por ejemplo, si el método de su tipo 'doX (n)' promete tomar O(n)
(lineal) tiempo, 'doX (n)' en subtipo puede tomar O(1)
(constante) tiempo, pero no puede tomar O(n^2)
tiempo.
Consulte ** diseño por contrato ** [en Wikipedia] (https://en.wikipedia.org/wiki/Design_by_contract) y [en c2.com] (http://wiki.c2.com/?DesignByContract) –