contratto di tipo (classe, interfaccia, enum) è la, beh, il contratto questo tipo promette di rispettare.Si afferma:
- quali sono i parametri accettabili per il costruttore e/oi metodi di questo tipo;
- cosa dovresti e/o non dovresti aspettarti da questo tipo. Ad esempio, si può affermare che ci si aspetta che questa classe sia sicura per i thread o non thread-safe;
- quali sono gli invarianti supportati da questo tipo. Ad esempio, digitare il metodo
addData(float)
della classe MathAverage
che calcola la media del suo input può indicare che ogni volta che viene restituita la chiamata a add(float)
, è necessario chiamare il numero MathAverage.getAverage()
per restituire la media corretta dell'ingresso corrente.
- in generale, il tuo tipo può specificare qualsiasi vincolo che deve seguire tutti i sottotipi. Ad esempio, potrebbe dire "nessun metodo di questo tipo deve impiegare più di 1 secondo per essere eseguito".
Il contratto è specificato in forma libera in javadoc di tipo. Esistono alcuni strumenti/pratiche per far rispettare l'esecuzione dei contratti, ma sono limitati, esattamente perché il contratto può essere arbitrario o, addirittura, auto-contraddittorio, in caso di errore del programmatore.
Poiché la sottotipizzazione (sottoclasse) può estendere/modificare il comportamento dei metodi supertipo in modo arbitrario, può anche violare alcune parti del contratto del supertipo. Esempio di questo sarebbe l'estensione HashMap
, che accetta valori e chiavi null
, con qualche implementazione che proibisce i valori null
nelle chiamate ai suoi metodi.
Altro aspetto importante su contratto tipo è che sottotipo può avere forte contratto (che copre sottoinsieme di vincoli nel contratto di tipo), ma non può avere più debole contratto (che copre superset di vincoli nel contratto di tipo). Ad esempio, se il metodo del tipo 'doX (n)' promette di assumere l'ora O(n)
(lineare), 'doX (n)' nel sottotipo può richiedere O(1)
(costante) ora, ma non può prendere il tempo O(n^2)
.
fonte
2011-12-16 16:29:16
Vedere ** design per contratto ** [su Wikipedia] (https://en.wikipedia.org/wiki/Design_by_contract) e [su c2.com] (http://wiki.c2.com/?DesignByContract). –