簡體   English   中英

Java類構造函數具有范圍限制的參數

[英]Java Class Constructor Parameters with range limits

我是Java新手,我問這個問題只是為了幫助我更好地理解OOP。

假設我正在定義一個名為Hour的新類。 要實例化此類,我們需要指定一個整數來指示此實例的小時。

Hour hr = new Hour(16); // this means to define an hour that indicates 4pm.

因此,當我們在這里定義Hour Class時,構造函數的參數應在[0,24]范圍內。 我們如何定義這樣的參數,如果指定了超出此范圍的參數,是否可以拋出錯誤?

謝謝。

您可以使用IllegalArgumentException

拋出以指示方法已被傳遞非法或不適當的參數。

public class Hour
{
    Hour(int hour)
    {
       if(hour>=24 || hour<0)
        {
           throw new IllegalArgumentException("Hour should in the range of [0-23].");
       }
   }
  ...............
}  

如果您希望編譯器捕獲錯誤,您可以定義小時的枚舉,然后將其用作Hour的構造函數的參數。 但這可能會使Hour課無用。

public class Hours {
    _1, _2, _3, // etc.
}

public class Hour {
    public Hour(Hours hour) { // no need for runtime check here, can not be wrong}
}

Hour hour = new Hour(Hours._3);

這種技術在這里可能不是最好的,但通常最好依賴於編譯時檢查而不是運行時檢查。

不幸的是,與Pascal和其他語言不同的Java不支持范圍類型。 但是,您可以使用其他技術。

最簡單的方法是檢查代碼中的值。

class Hour {
    private final int h;
    public Hour(int h) {
        if (h < 0 || h >= 24) {
            throw new IllegalArgumentException("There are only 24 hours");
        }
        this.h = h;
    }
}

您還可以使用更復雜的技術。 看看java Validation API在這種情況下,您的代碼將如下所示:

class Hour {
    @Max(23)
    @Min(0)
    private final int h;
    public Hour(int h) {
        this.h = h;
    }
}

但是您必須使用此API的一個可用實現並調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM