我在很多网站上都看过私有构造函数,并在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();
}
}
我的程序执行得非常好。我理解这个概念错了吗?
答案 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。