2017-06-21 5 views
4

戻り値が指定された範囲にあるメソッドを提供するinterfaceメソッドを提供する小さなライブラリを作成しています。このメソッドを実装しているライブラリのユーザーが、この範囲にない値を返すことを明示的に禁止するにはどうすればよいですか?インターフェイスの戻り値をクラスを実装する範囲に制限します。

このような何か:

//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 
    } 

} 

私は

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; 
    } 
} 

のようなものを書いて、代わりにdoubleの本を返すことができると思うが、それはdoubleあるので、これは、十分に感じることはありません。 0〜10の間で作業したい場合は、DoubleBetweenZeroAndTenではありません。

これを明示的に禁止することができない場合、ユーザーが違反しないようにするための最良の方法は何ですか?

答えて

1

whatsYourFavoriteNumberBetweenZeroAndTen()メソッドからdouble値を返すことをインターフェースを実装するユーザーに明示的に禁止することはできません。

インタフェースによって定義されたコントラクトの一部として、インタフェースのJavadocで返される値の予想範囲のみを定義できます。ライブラリがそのインタフェースの実装を使用するクラスを持っていると仮定すると、そのメソッドが指定した契約に違反する値を返す場合、これらのクラスは例外をスローする可能性があります。

これはJDKの標準プラクティスです。たとえば、Comparatorのコントラクトcompare()メソッドは、すべての実装の予想される動作を定義し、実装を使用するJDKクラスで例外または予期しない結果が発生する可能性があります。 (例えばCollections.sort(List<T> list, Comparator<? super T> c)、そのJavadocはIllegalArgumentException (optional) if the comparator is found to violate the Comparator contractを投げるかもしれません)。

関連する問題