私有构造函数在java中有什么用处

时间:2013-06-27 12:11:19

标签: java

我想知道私有构造函数在java中是如何有用的。 这是在java中使用私有构造函数的不同方法。

11 个答案:

答案 0 :(得分:38)

私有构造函数当然不能限制类的实例化。

实际上私有构造函数的好用是Singleton Pattern。这是一个例子

public class ClassicSingleton {
   private static ClassicSingleton instance = null;
   private ClassicSingleton() {
      // Exists only to defeat instantiation.
   }
   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
}
通过这种方式,您可以确保只有一个实例的类处于活动状态。

其他用途可以是创建实用程序类,它只包含静态方法。

对于更多分析,您可以查看其他Stack溢出答案

Can a constructor in Java be private?

What is the use of making constructor private in a class?

private constructor

答案 1 :(得分:8)

如果您希望此类无法从外部进行初始化,则使用

私有构造函数
用途

案例1:创建sington类时

public class SingletonClass {

    public static SingletonClass singletonClass;

    private SingletonClass() {
    }

    public static SingletonClass getInstance() {
        if(singletonClass == null) {
            singletonClass = new SingletonClass();
        }
        return singletonClass;
    }
}

在这种情况下,只有初始化由getInstance方法完成。没有人可以在外面创建Single of SingletonClass表单。



案例2:,当您不想要像util类

中的任何对象实例时
public final class Util {

    private Util() {
    }
}

在util类中,所有方法都是静态的,因此不需要创建其对象,因此在这种情况下使用私有构造函数

答案 2 :(得分:8)

正如其他提到的答案,常见用途包括单件模式,内部构造函数链接以及另外一个:

Java不支持C#中的内容(例如)被称为“静态类” - 换句话说,实用程序类。实用程序类是一个辅助类,它应该只包含静态成员。 (MathSystem是Java中的这种情况。)以任何方式实例化它们都没有意义。

在C#中,使类静态使其隐式地为final / sealed和abstract。在Java中,没有这样的关键字,你不能使类最终抽象。所以,如果你有这样一个实用程序类,你可以使它成为最终的并给它一个永远不会被调用的私有构造函数。

答案 3 :(得分:5)

使用私有构造函数会阻止它由对象外部的任何东西创建。这通常用在像singleton模式这样的地方,它试图确保只存在一个类的实例。

This link also提供了一些很好的描述......

答案 4 :(得分:4)

您可能需要私有构造函数的一些原因:

在以下情况下防止对象外部的实例化:

  1. 工厂方法

  2. static-methods-only(utility)class

  3. 常量类

  4. 您也可以参考以下代码:

    public class MySingletonEx 
    {
    
        private static MySingletoneEx instance = new MySingletonEx("This takes a string");;
    
        private MySingletonEx(final String myString)
        {
            // This is a private constructor
        }
    
        public static MySingletonEx getInstance() 
        {
            return instance;
        }
    }
    

答案 5 :(得分:2)

作为其他答案的补充:

如果要创建单例类,则需要隐藏构造函数,因此只能在内部调用。

答案 6 :(得分:1)

恕我直言,有些用法是

  1. in Singleton
  2. 来自另一个构造函数..

答案 7 :(得分:1)

您可能不希望该类的用户直接实例化它,而是使用方便的静态方法代替,对于一个非常人为的构建器示例:

public FooBuilder {

    private FooBuilder(FooBar bar) {
        ...
    }

    public static FooBuilder using(FooBar bar) {
        return new FooBuilder(bar);
    }

}

然后通过调用静态方法使用它:

FooBuilder.using(bar) // further chained methods etc...

答案 8 :(得分:0)

当你不希望某个特定的类被实例化时。

答案 9 :(得分:0)

私有构造函数的另一个用途是确保只存在一组有限的类实例。

例如:

public class Color
{
    public static final Color red = new Color("red");
    public static final Color yellow = new Color("yellow");
    public static final Color blue= new Color("blue");

    private Color(String name) {
        this.name = name;
    }

    .
    .
    .
}

然而,这种用法主要被Java枚举取代。

答案 10 :(得分:0)

这是私有构造函数的一些用途。

  1. 设计单例模式的能力(所有对象之间仅共享一个对象实例)。

2。限制实例创建的次数。

3。防止子类化。