在Java中是否有可能让构造函数返回该类的另一个实例,而不是构造/返回它自己?

时间:2014-01-03 06:57:15

标签: java constructor

在Java中是否有可能让构造函数返回该类的另一个实例,而不是构造/返回自身?

有点像

public class Container {
    private static Container cachedContainer = new Container(5,false);
    private int number;
    public Container(int number, boolean check) {
        if (number == 5 && check) {
            return cachedContainer;   // <-- This wouldn't work
        }
        this.number = number;
    }
}

在该示例中,如果您创建一个包含数字5的对象(并使用“check”标志),它将“中断”构造,而是为您提供一个已包含5的预先存在的对象。导致这种中断。

3 个答案:

答案 0 :(得分:15)

不,这就是静态factory method pattern进来的地方

您可以执行自定义计算并确定是否在静态工厂方法

中创建实例

考虑这个例子:

public static Container createContainer(int number, boolean check) {
    if (number == 5 && check) {
      // returned cached instance
    }
    // construct new instance and return it
}

来自有效的java

第1项:考虑静态工厂方法而不是构造函数

要点:

  • 它可以有名称与客户进行明确的沟通
  • 您可以执行自定义逻辑,而不必每次都创建实例
  • 您可以返回子类型

另见

答案 1 :(得分:5)

那是不可能的,因为构造函数只是意味着为对象设置稳定状态,以后可以安全使用。简而言之,一旦初始化了对象,构造函数就可用于设置内部状态。所以返回任何东西都没有意义。

你可以做的是拥有一个可以为你创建对象的公共静态方法。类似的东西:

public class Container {
    private static Container cachedContainer = new Container(5);
    private int number;
    public Container(int number) {
        this.number = number;
    }

   public static Container getContainer(int number, boolean check){
     if (number == 5 && check) {
        return cachedContainer;   
    } else return new Container(number);
}

答案 2 :(得分:1)

你需要这样的东西:

public class Container {
    private static final Container CACHED_CONTAINER = new Container(5);
    private final int number;

    private Container(final int number) {
        this.number = number;
    }

    public static Container container(final int num, final boolean check) {
        if (num == 5 && check) {
            return CACHED_CONTAINER;
        }
        return new Container(num);
    }
}