3

I'm new to Java and I'm asking this question just to help me better understand OOP.

Let's say I'm defining a new Class called Hour. To instantiate this Class, we need to specify an integer to indicate the hour of this instance.

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

So when we define the Hour Class here, the parameter for the constructor should within the range [0, 24). How can we define such a parameter and can I throw an error when a parameter that is out of this range is specified?

Thanks.

4

3 回答 3

4

您可以使用IllegalArgumentException

抛出以指示方法已传递了非法或不适当的参数。
例子

public class Hour
{
    Hour(int hour)
    {
       if(hour>=24 || hour<0)
        {
           throw new IllegalArgumentException("Hour should in the range of [0-23].");
       }
   }
  ...............
}  
于 2013-09-02T18:33:00.320 回答
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);

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

于 2013-09-02T18:36:16.567 回答
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 的可用实现之一并调用它。

于 2013-09-02T18:37:13.123 回答