【问题标题】:What's the use of private constructor in Java?Java中私有构造函数有什么用?
【发布时间】:2013-06-24 22:26:04
【问题描述】:

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

【问题讨论】:

  • 当你不想让别人创建你的类的实例时(至少通过调用构造函数)。
  • @R Martinho Fernandes 我也想回答这个关于 C++ 的问题......
  • 那么你需要改变你的问题。您只是要求一个 Java 场景。
  • @AmrutDange,好吧,C++ 提供了一种替代解决方案,它使用免费函数而不是实用程序类,所以没有了。

标签: java


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    作为其他答案的补充:

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

    【讨论】:

    • 是的,看看其他 50 个答案告诉你同样的事情:-D
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      恕我直言,一些用法是

      1. 在单身
      2. 来自另一个构造函数..

      【讨论】:

        【解决方案5】:

        私有构造函数用于当你希望这个类不能从外部初始化时
        用途

        案例 1: 创建 sington 类时

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

        在这种情况下,只有通过 getInstance 方法进行初始化。没有人可以在外面创建单例类形式的对象。



        案例 2: 当您不想要 util 类中的任何对象实例时

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

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

        【讨论】:

        • 根据stackoverflow.com/questions/323022/…我认为使用静态util类,您不需要创建私有构造函数。
        • @ZuzooVn 在java中你不能创建静态类。您在评论中提到的问题是基于 C# 语言的
        • "没有人可以从外面创建SingletonClass的Object。" 如果外面做SingletonClass s = SingletonClass.getInstance(); ?我认为您示例中的好处是防止存在多个 SingletonClass 实例。
        【解决方案6】:

        私有构造函数是为了限制类的实例化。

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

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

        这样您可以确保只有一个实例类处于活动状态。

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

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

        Can a constructor in Java be private?

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

        private constructor

        【讨论】:

          【解决方案7】:

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

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

          1. 单例

          2. 工厂方法

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

          【讨论】:

            【解决方案8】:

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

            例如:

            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 枚举所取代。

            【讨论】:

              【解决方案9】:

              正如其他答案所述,常见用途包括单例模式、内部构造函数链接等等:

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

              在 C# 中,将类设为静态会使其隐含地成为最终/密封和抽象。在 Java 中,没有这样的关键字,您不能将类 final 抽象化。因此,如果你有这样一个实用程序类,你会将它设为 final 并给它一个从未调用过的私有构造函数。

              【讨论】:

              • 顺便说一句,静态类的新方法是enum
              • @MarkoTopolnik 你能举个例子吗?
              • public enum Utility {; public static void fn1() {} }
              • @MarkoTopolnik 哇。以前没见过。绝对有趣。
              【解决方案10】:

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

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

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

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

              【讨论】:

                【解决方案11】:

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

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

                2.限制实例创建的数量。

                3.防止子类化。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2019-10-16
                  • 2016-10-13
                  • 2017-03-28
                  • 1970-01-01
                  相关资源
                  最近更新 更多