Una dichiarazione dell'interfaccia Java può far valere le proprietà dei parametri?

0

Per quanto ne so, dichiarare un'interfaccia è così:

public interface Roots_Squares {
    public double square_root( double value );
}

Ora ... come imponi il valore per avere valori non negativi? Tale funzione dovrebbe evitare i valori negativi giusto? Se qualcuno crea una classe che implementa questo, e quell'implementazione non gestisce valori negativi, e poi io uso la loro classe con un valore negativo ... beh, le cose si rompono.

È quindi mia responsabilità controllare i negativi quando sono abbastanza sicuro che l'implementatore dovrebbe eseguire il controllo.

    
posta user2738698 04.04.2014 - 21:11
fonte

4 risposte

3

Come spiegato un po 'più a fondo in questa risposta , questo è (parte del) prezzo che si paga per un interfaccia. Se vuoi essere in grado di utilizzare nuove implementazioni della tua astrazione in qualsiasi momento, non hai modo di forzare tali implementazioni a essere corrette.

    
risposta data 04.04.2014 - 21:18
fonte
0

I commenti sulla risposta di Doval sono giusti: crea e usa un PositiveDouble. Inoltre, considera l'utilizzo di uno strumento di progettazione per contratto. Uno strumento di design per contratto come cofoja potrebbe risolvere il tuo problema. Non ho usato 1 ma so che ci sono diversi progetti per strumenti di contratto in Java.

    
risposta data 26.11.2014 - 21:49
fonte
0

La tua interfaccia dovrebbe documentare come gestisce l'input fasullo e può dichiarare le eccezioni che getterà. In questo caso, un semplice

@throws IllegalArgumentException farebbe il trucco.

    
risposta data 27.11.2014 - 01:46
fonte
-1

La risposta di Doval è ormai superata. Puoi utilizzare le proprietà dei parametri enforce (controlla argomenti) nell'interfaccia:

public interface Math {
    /**
     * @throws IllegalArgumentException if value <= 0
     */
    default public void sqrt(Double value) {
        if(value <= 0) throw new IllegalArgumentException("value must be greater than 0");
        squareRoot(value);
    }

    public void squareRoot(Double value);
}
    
risposta data 30.11.2014 - 08:46
fonte

Leggi altre domande sui tag