2017-06-21 4 views
4

J'écris une petite bibliothèque où j'ai quelques interface fournissant une méthode où la valeur de retour doit être dans une plage spécifiée. Comment puis-je interdire explicitement aux utilisateurs de ma bibliothèque qui implémentent cette méthode de renvoyer une valeur qui ne se trouve pas dans cette plage?Restreindre la valeur de retour d'une interface à une plage dans l'implémentation des classes

Quelque chose comme ceci:

//Library 
interface FavoriteNumber { 

    //returned value must lie between 0 and 10 
    double whatsYourFavoriteNumberBetweenZeroAndTen(); 
} 

... 

//Classes implemented by user of library 
class ILikePi implements FavoriteNumber { 

    @Override 
    public double whatsYourFavoriteNumberBetweenZeroAndTen() { 
     return 3.141; //Should be allowed 
    } 

} 

... 

class AnswerToLifeTheUniverseAndEverything implements FavoriteNumber { 

    @Override 
    public double whatsYourFavoriteNumberBetweenZeroAndTen() { 
     return 42; //Should be forbidden 
    } 

} 

Je pense que je pourrais écrire quelque chose comme

class DoubleBetweenZeroAndTen { 

    private final double value; 

    DoubleBetweenZeroAndTen(double value) { 
     if (value < 0 || value > 10) { 
      throw new IllegalArgumentException("value must be between 0 and 10"); 
     } 
     this.value = value; 
    } 

    double toDouble() { 
     return this.value; 
    } 
} 

et retourner ce lieu du double mais cela ne se sent pas assez bon, car il est un double entre 0 et 10 que vous souhaitez utiliser par la suite, et non DoubleBetweenZeroAndTen.

S'il n'est pas possible d'interdire cela explicitement, quel est le meilleur moyen de s'assurer que l'utilisateur ne le violera pas? (En ce moment, j'ai un avis dans la javadoc.)

Répondre

1

Vous ne pouvez pas interdire explicitement les personnes qui mettent en œuvre l'interface de retourner une valeur double de la méthode whatsYourFavoriteNumberBetweenZeroAndTen().

Vous pouvez uniquement définir la plage attendue de valeurs renvoyées dans le Javadoc de l'interface, dans le cadre du contrat défini par l'interface. En supposant que votre bibliothèque a des classes qui utilisent des implémentations de cette interface, ces classes peuvent renvoyer une exception si cette méthode renvoie une valeur qui viole votre contrat déclaré. Ceci est une pratique standard dans le JDK - par exemple, le contrat de la méthode compare() de Comparator définit le comportement attendu de toutes les implémentations, et ne pas suivre le contrat pourrait entraîner des exceptions ou des résultats inattendus dans les classes JDK utilisant des implémentations. de l'interface (telle que Collections.sort(List<T> list, Comparator<? super T> c), dont Javadoc indique qu'elle peut lancer IllegalArgumentException (optional) if the comparator is found to violate the Comparator contract).