【问题标题】:Java Class Constructor Parameters with range limits具有范围限制的 Java 类构造函数参数
【发布时间】:2013-09-02 18:27:40
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • 为什么要重新发明轮子,而不使用预定义的 Date API?或者更好地使用Joda Time

标签: java constructor


【解决方案1】:

您可以使用IllegalArgumentException

抛出表明一个方法被传递了一个非法或不适当的参数。
例子

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

【讨论】:

  • 让它hour &gt;= 24。最好抛出InstantiationException,并带有适当的消息,因为它在构造函数中。
  • @RohitJain 是的,我们也可以抛出 InstantiationException,但这是一个检查异常,我们需要 throws 它。
  • @RohitJain hm... 没问题。但我认为这里没有必要。谢谢你的建议,我会更新答案。
  • 不要让它保持原样。我觉得还可以。
  • @RohitJain InstantiationException 在这里是错误的,应该很明显是IllegalArgumentException,因为它是这样的。 InstantiationException 用于反射上下文。请阅读文档。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    不幸的是,Java 不像 Pascal 和其他语言不支持范围类型。但是,您可以使用其他技术。

    最简单的方法是检查代码中的值。

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

    您还可以使用更复杂的技术。看看javaValidation API 在这种情况下,您的代码将如下所示:

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

    但您必须使用此 API 的可用实现之一并调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2021-06-17
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 2017-08-31
      相关资源
      最近更新 更多