什么';Java中私有构造函数的用法是什么?

什么';Java中私有构造函数的用法是什么?,java,Java,我想知道私有构造函数在Java中有多有用。 在Java中使用私有构造函数的不同方式有哪些?当您不希望某个特定类被实例化时。作为其他答案的补充: 如果要创建单例类,需要隐藏构造函数,因此只能在内部调用它。使用私有构造函数会阻止对象“外部”的任何对象创建它。这通常用于模式之类的事情,在模式中,它试图确保只存在一个类实例 提供了一些很好的描述 有些用法是什么 单身汉 来自另一个构造函数 私有构造函数用于希望此类不能从外部初始化时 使用 案例1:创建sington类时 public class Si

我想知道私有构造函数在Java中有多有用。
在Java中使用私有构造函数的不同方式有哪些?

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

作为其他答案的补充:


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

使用私有构造函数会阻止对象“外部”的任何对象创建它。这通常用于模式之类的事情,在模式中,它试图确保只存在一个类实例

提供了一些很好的描述

有些用法是什么

  • 单身汉
  • 来自另一个构造函数
    私有构造函数用于希望此类不能从外部初始化时
    使用

    案例1:创建sington类时

    public class SingletonClass {
    
        public static SingletonClass singletonClass;
    
        private SingletonClass() {
        }
    
        public static SingletonClass getInstance() {
            if(singletonClass == null) {
                singletonClass = new SingletonClass();
            }
            return singletonClass;
        }
    }
    
    在这种情况下,只有初始化是通过getInstance方法完成的。没有人可以在外部创建SingletonClass形式的对象



    案例2:当您不需要任何类似于util类的对象实例时

    public final class Util {
    
        private Util() {
        }
    }
    

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

    私有构造函数是不正确的,以限制类的实例化

    实际上,私有构造函数的一个很好的用法是在单例模式中。这里有一个例子

    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;
       }
    }
    
    这样,您可以确保只有类的一个实例处于活动状态

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

    为了进行更多分析,您可以查看其他堆栈溢出答案


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

    为了防止在对象之外实例化,在以下情况下:

  • 独生子女

  • 工厂法

  • 仅静态方法(实用工具)类

  • 仅常量类

  • 您也可以参考以下代码:

    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;
        }
    }
    

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

    例如:

    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;
        }
    
        .
        .
        .
    }
    
    public FooBuilder {
    
        private FooBuilder(FooBar bar) {
            ...
        }
    
        public static FooBuilder using(FooBar bar) {
            return new FooBuilder(bar);
        }
    
    }
    

    但是,这种用法大部分已被Java枚举所取代。

    如其他答案所述,常见的用法包括单例模式、内部构造函数链接以及一种以上的方法:

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


    在C#中,将类设为静态将使其隐式地成为final/sealed和abstract。在Java中,没有这样的关键字,并且不能使类成为最终的和抽象的。因此,如果您有这样一个实用程序类,您应该将其设置为最终类,并为其提供一个从未调用过的私有构造函数。

    您可能不希望该类的用户直接实例化它,而是使用一个方便的静态方法,例如:

    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;
        }
    
        .
        .
        .
    }
    
    public FooBuilder {
    
        private FooBuilder(FooBar bar) {
            ...
        }
    
        public static FooBuilder using(FooBar bar) {
            return new FooBuilder(bar);
        }
    
    }
    
    然后通过调用静态方法使用它:

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

    下面是私有构造函数的一些用法

  • 能够设计单例模式(所有对象之间只共享一个对象实例)
  • 2.限制创建实例的数量


    3。防止子类。

    当你不希望某人做出你的类的实例(至少通过调用构造函数)。可能的复制-@ R Martinho Fernandes。我想对C++的这个问题也回答……然后你需要改变你的问题。C++ AmrutDange提供了一个替代自由的函数而不是实用类的解决方案,这样一来,对静态类的新方法是:代码> EnUM < /C>。java可以给出一个例子吗?<代码>公共枚举实用程序{;公共静态空格fn1()} } /代码> @ MakOtOutNikWOW。我以前没见过。非常有趣。是的,看到其他50个答案告诉你同样的事情:-根据我的想法,使用静态util类,你不需要创建私有构造函数。@ZuzooVn在java中,你不能创建静态类。您在评论中提到的问题是基于C语言“没有人可以从外部创建SingletonClass的对象。”如果外部执行SingletonClass s=SingletonClass.getInstance()?我认为您的示例中的好处是防止存在多个SingletonClass实例。