构造函数可以不返回新实例吗?

时间:2015-02-01 16:41:38

标签: java instantiation

是否有可能让构造函数根据参数决定不创建新实例?例如:

public class Foo{

    public Foo(int n){

        if(n<0){
            //DO NOT make this 
        }
        else{
            //Go ahead and make this instance 
        }
    }
}

我知道不可能这样做:

 public class Foo{

     public Foo(int n){

         if(n<0){
             //DO NOT make this 
             this = null; 
         }
         else{
             //Go ahead and make this instance 
         }
    }
}

有没有办法正确地做同样的事情?

3 个答案:

答案 0 :(得分:7)

构造函数无法控制将返回的内容。但是,您可以使用静态工厂方法以获得更大的灵活性:

public static Foo newInstance(int n) {
    if (n < 0) {
        return null;
    } else {
        return new Foo(n);
    }
}

当提供无效数字时,最好抛出异常而不是返回null

if (n < 0) {
    throw new IllegalArgumentException("Expected non-negative number");
} ...

答案 1 :(得分:2)

构造函数不返回实例。 new运算符(as part of the instance creation expression)创建实例,构造函数初始化它。一旦你理解了这一点,你就会意识到你无法按照你的意思行事。

您的调用代码应决定是否创建实例,而不是构造函数。

答案 2 :(得分:0)

你无法做你想做的事。但是,如果您的要求是基于某些条件创建实例,则可以为该类提供静态方法,并根据条件决定是否创建新实例。