如果我们有A级和A级B,而A类的构造函数是私有的,我们想在B中使用A的实例,怎么做?我看到一个答案说“提供一个静态方法或变量,允许访问从类中创建的实例”,但我不明白。
答案 0 :(得分:5)
您寻找的代码模式称为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;
}
}
答案 1 :(得分:3)
A需要有一个提供类A实例的公共方法,例如:
class A {
/*Constructors and other methods omitted*/
public static A getInstance() {
return new A();
}
}
答案 2 :(得分:1)
或者,如果B是A的内部类(反之亦然),那么B可以直接引用构造函数,例如:
public class A {
private A() {}
public static class B {
private A instanceOfA = new A();
public B() {}
}
}
答案 3 :(得分:1)
只有私有构造函数的类是设计,以便其他类无法直接实例化它。据推测,这是有充分理由的。该类可以提供工厂方法来实例化类...或获取类的现有实例。
如果需要更改设计,最好的方法是修改类;例如通过使构造函数可见,或通过添加工厂方法。如果你不能这样做,我认为可以使用反射来破坏可见性规则并使用私有构造函数创建实例。但是,我只是作为最后的手段做到这一点......而不是在仔细分析整体应用的后果之前。
答案 4 :(得分:0)
私有构造函数旨在使类不具有任何实例。但是可以使用 super()从子类访问内容。实施是这样的:
公共类ClassA {
private int val;
私人ClassA(int val)
{this.val = val;
}
public int getVal(){ 返回val;
}
}
公共类ClassB扩展了ClassA {
public ClassB(int val){ 超级(VAL); }}
...
ClassB b = new ClassB(4);
System.out.println(“b的值:+ b.getVal());
答案 5 :(得分:0)