Java类构造函数具有范围限制的参数

时间:2013-09-02 18:27:40

标签: java constructor

我是Java新手,我问这个问题只是为了帮助我更好地理解OOP。

假设我正在定义一个名为Hour的新类。要实例化此类,我们需要指定一个整数来指示此实例的小时。

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

因此,当我们在此定义Hour Class时,构造函数的参数应在[0,24]范围内。我们如何定义这样的参数,如果指定了超出此范围的参数,我可以抛出错误吗?

感谢。

3 个答案:

答案 0 :(得分:4)

您可以使用IllegalArgumentException

  

抛出表示方法已被传递非法或不恰当的参数   例子

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

答案 1 :(得分:1)

如果您希望编译器捕获错误,您可以定义小时的枚举,然后将其用作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);

这种技术在这里可能不是最好的,但通常最好依赖编译时检查而不是运行时检查。

答案 2 :(得分:1)

不幸的是,与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的一个可用实现并调用它。