使用私有构造函数创建类的对象

时间:2014-11-05 07:47:54

标签: java constructor

我在很多网站上都看过私有构造函数,并在StackOverflow上提到了各种问题。但是,我无法理解它们的用法。大多数网站都说当我们想要限制可以创建的对象的实例数量时,可以使用私有构造函数。

我尝试了以下程序:

public class PrivateCons{
   private PrivateCons(){
    System.out.println("I'm executed");
   }

   public static void main(String[] args) {
      PrivateCons p=new PrivateCons();
      PrivateCons q=new PrivateCons();
   }
}

我的程序执行得非常好。我理解这个概念错了吗?

4 个答案:

答案 0 :(得分:2)

Private个字段可以在课程中访问,您不能在课堂上访问它们,例如: -

class PrivateCons{
   private PrivateCons(){
    System.out.println("I'm executed");
   }
}

public class Test{
   public static void main(String[] args) {
      PrivateCons p=new PrivateCons(); //this will fail- compiler error
      PrivateCons q=new PrivateCons();//this will fail- compiler error
   }
}

私有构造函数主要用于implementing Singleton Pattern,当只需要该类的一个对象时使用。以链接本身的维基百科文章为例: -

public class singleton
{
    private static singleton _obj;

    private singleton()
    {
        // prevents instantiation from external entities
    }

    // Instead of creating new operator, declare a method
    // and that will create object and return it.

    public static singleton GetObject()
    {
        // Check if the instance is null, then it
        // will create new one and return it.
        // Otherwise it will return previous one.

        if (_obj == null)
        {
            _obj = new singleton();
        }

        return _obj;
    }

}

您可以扩展此示例并将对象限制为2,3或任何数字,或者换句话说,重新引用类的实例数。

答案 1 :(得分:1)

在同一个类中,您可以访问私有构造函数。从其他类中,您无法调用该构造函数。

您可以使用私有构造函数来实现Singleton设计模式。

public class PrivateCons
{
   PrivateCons instance = new PrivateCons ();
   private PrivateCons(){
    System.out.println("I'm executed");
   }
   public static PrivateCons getInstance()
   {
       return instance;
   }
}

现在,您的类的用户只能通过getIstnace方法获取您的类的单个实例,因为他们无法通过私有构造函数创建新实例。

答案 2 :(得分:1)

私人构造函数不限制所创建实例的数量;它限制 where 可以调用构造函数。

它阻止从顶级类的范围之外调用构造函数(在本例中为PrivateCons)。

答案 3 :(得分:0)

请看下面的例子:

public class ClassWithPrivateConstructor {

private static final Random random = new Random();
private static final int count = 10;
private static final ClassWithPrivateConstructor[] instances = new ClassWithPrivateConstructor[count]; 
static    
{
    for (int i = 0; i < count; i++) {
        instances[i] = new ClassWithPrivateConstructor();
    }
}

public static ClassWithPrivateConstructor newInstance() {
    return instances[random.nextInt(count)];
}

private ClassWithPrivateConstructor() {        
}
}

测试类:

public class ClassWithPrivateConstructorTest {
public static void main(String[] args) {
    for(int i=0;i<20; ++i) {
        System.out.println(ClassWithPrivateConstructor.newInstance());
    }
}
}

示例输出: ClassWithPrivateConstructor @ 14ae5a5 ClassWithPrivateConstructor @ 7f31245a ClassWithPrivateConstructor @ 7f31245a ClassWithPrivateConstructor @ 14ae5a5 ClassWithPrivateConstructor @ 6d6f6e28 ClassWithPrivateConstructor @ 7f31245a ClassWithPrivateConstructor @ 14ae5a5 ClassWithPrivateConstructor @ 135fbaa4 ClassWithPrivateConstructor @ 6d6f6e28 ClassWithPrivateConstructor @ 45ee12a7 ClassWithPrivateConstructor @ 330bedb4 ClassWithPrivateConstructor @ 45ee12a7 ClassWithPrivateConstructor @ 7f31245a ClassWithPrivateConstructor @ 135fbaa4 ClassWithPrivateConstructor @ 14ae5a5 ClassWithPrivateConstructor @ 2503dbd3 ClassWithPrivateConstructor @ 6d6f6e28 ClassWithPrivateConstructor @ 4b67cf4d ClassWithPrivateConstructor @ 7ea987ac ClassWithPrivateConstructor @ 45ee12a7

正如您所看到的,在这种情况下,类实例的数量限制为10。