java - 如果构造函数的参数非法,则阻止类的实例化?

标签 java

我有一个公共(public)构造函数,它采用一个参数 (int age) 来创建一个对象。我想检查传递的参数是否合法,例如年龄不能为负数。如果它是非法的,则不要创建对象/实例。如果合法,没问题。

我只能想到一种方法 -

将构造函数设为私有(private)。创建一个带有参数 (int age) 的静态方法来进行所有检查,如果您向它传递非法值,则返回 null。如果你传递给它一个合法的值,那么创建一个对象并返回它的引用。 还有其他方法吗?也许来自构造函数本身?

编辑: 我想到了上述方法的一个问题。出于显而易见的原因,工厂方法/对象创建者方法只能是静态方法。如果工厂方法必须访问成员变量(进行一些检查) 以创建对象,会发生什么情况?然后,我们将被迫将该成员变量设为静态。这可能并非在所有情况下都可以。

有意义吗?

最佳答案

Is there any other way of doing it ? Maybe from inside the constructor itself ?

是的。我建议从构造函数中抛出一个Exception

public class Person
{


    int age;
    public Person(int age) throws Exception
    {
       if(age <= 0)
       {

          throw new Exception("Age is not allowed");
       }
       // Do some stuffs
       this.age = age;
    }

}

编辑:

您也可以按照 Till Helge Helwig 的建议使用 IllegalArgumentException

public class Person
{


    int age;
    public Person(int age) throws IllegalArgumentException
    {
       if(age <= 0)
       {

          throw new IllegalArgumentException("Age is not allowed");
       }
       // Do some stuffs
       this.age = age;
    }

}

关于java - 如果构造函数的参数非法,则阻止类的实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14394590/

相关文章:

java - 值没有输入到 mysql 数据库中

java - 解释 "volatile"在java中的用法?

java - 将渲染偏移量添加到 Frame

java - 使用目录时 URLClassLoader 有什么问题?

java - 小程序和 SWING 有什么区别?

java - 递归java星号

java - Maven,Jenkins - 如何将项目构建到不同的测试环境?

java - equals(Object obj )"should be overridden along with the "compareTo(T obj)"方法

java - 如何编写字符串扁平化器?

java - 使用Java ProcessBuilder调用全局安装的 Node 模块