繁体   English   中英

如何使用具有私有构造函数的类的实例?

[英]How to use an instance of a class that has a private constructor?

如果我们有类A和B,并且类A的构造函数是私有的,并且我们想在B中使用A的实例,该怎么做? 我看到一个回答,说“提供一个静态方法或变量,该方法或变量允许访问从该类内部创建的实例”,但我不明白。

您寻找的代码模式称为Factory Method

该类提供了一个静态方法,该方法返回其自己的类的实例。 私有构造函数对于该类的所有方法(包括静态方法)都是可见的,因此静态方法可以代表调用方调用私有构造函数。

这是这种模式的示例:

public class A {
    private A() {
    }

    public static A create() {
        return new A();
    }
}

这通常与Singleton Pattern结合使用,它将上面的示例更改为:

public class A {
    private static A INSTANCE = new A();

    private A() {
    }

    public static A getInstance() {
        return INSTANCE;
    }
}

A需要有一个提供类A实例的公共方法,例如:

class A {
  /*Constructors and other methods omitted*/
  public static A getInstance() {
    return new A();
  }
}

或者,如果B是A的内部类(反之亦然),则B可以直接引用构造函数,例如:

public class A {
    private A() {}

    public static class B {
        private A instanceOfA = new A();

        public B() {}
    }
}

设计仅具有私有构造函数的类,以便其他类无法直接实例化它。 大概有一个合理的原因。 该类可以提供用于实例化该类或获取该类的现有实例的工厂方法。

如果需要更改设计,最好的方法是修改类。 例如,通过使构造函数可见,或添加工厂方法。 如果您不能这样做,我认为可以使用反射来打破可见性规则并使用私有构造函数创建实例。 但是,我只会在没有其他选择时才这样做,而不是在仔细分析整个应用程序的后果之前。

私有构造函数旨在使一个类不具有任何实例。 但是可以使用super()从子类访问内容。 实现是这样的:

公共类ClassA {
私人国际价
私人ClassA(int val)
{

  this.val = val; 

}

public int getVal(){return val;
}

}

公共类ClassB扩展了ClassA {

公共ClassB(int val){super(val); }}

...

ClassB b =新的ClassB(4);

System.out.println(“ b的值:” + b.getVal());

作为示例,请参见Calendar类。 要获取实例,您必须不调用其构造函数,而应使用静态方法:

Calendar rightNow = Calendar.getInstance();

资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM