2010-10-29 28 views

回答

4

commons.lang.math.Range只是指定範圍約束。它不代表該範圍內的價值(我認爲這是你想要的)。

您可以創建一個新類來保存該值並強制約束。你自己的程序會傳遞這個類的實例,從而獲得類型安全(強制執行約束)。調用其他API時,必須恢復發送並接受常規的double值。您可以在接受返回值之前再次檢查約束。

public class Radian extends Number { 

    private final double value; 

    public Radian(double value){ 
      if (value < 0 || value >= 2 * PI) 
       throw new IllegalArgumentException(value + " is out of range"); 
      this.value = value; 
    } 

    public double doubleValue(){ 
     return value; 
    } 

    // ... and other methods in the Number interface 
    // don't forget equals and hashCode and toString 
} 
+0

+1使這個不可變 – 2010-10-29 03:07:00

+0

爲什麼你想這是不可變的?只是好奇。 – Xavier 2010-11-03 02:08:38

+1

@ vlad003:爲什麼你想讓它變得可變? JDK中的所有Number類都是不可變的。 – Thilo 2010-11-03 03:01:43

0

Java沒有聲明一個基本類型的阿達樣型,具體而言沒有辦法來聲明是原始類型的子範圍的類型。

在Java中可以做的最好的事情是爲基元類型創建自定義包裝類,並讓包裝使用(純粹)運行時檢查來強制範圍約束。

+0

如果所有的代碼都只使用包裝器,那麼幾乎可以獲得編譯時類型的安全性。當然,它必須與外部接口的部分必須依賴運行時檢查。 – Thilo 2010-10-29 04:50:14

+0

問題在於範圍檢查;例如當你將兩個受約束的數字加在一起時。在Java中,這些檢查只能在運行時執行。在Ada中,智能編譯器可以在編譯時進行一些檢查;例如在涉及範圍類型的常量表達式中 – 2010-10-29 04:56:52

相關問題