Java中私有构造函数有啥用?
Posted
技术标签:
【中文标题】Java中私有构造函数有啥用?【英文标题】:What's the use of private constructor in Java?Java中私有构造函数有什么用? 【发布时间】:2013-06-24 22:26:04 【问题描述】:我想知道私有构造函数在 Java 中的用途。 在 Java 中使用私有构造函数有哪些不同的方法?
【问题讨论】:
当你不想让别人创建你的类的实例时(至少通过调用构造函数)。 可能重复 - ***.com/questions/2816123/… @R Martinho Fernandes 我也想回答这个关于 C++ 的问题...... 那么你需要改变你的问题。您只是要求一个 Java 场景。 @AmrutDange,好吧,C++ 提供了一种替代解决方案,它使用免费函数而不是实用程序类,所以没有了。 【参考方案1】:当您不希望某个特定类被实例化时。
【讨论】:
【参考方案2】:作为其他答案的补充:
如果要创建单例类,需要隐藏构造函数,所以只能在内部调用。
【讨论】:
是的,看看其他 50 个答案告诉你同样的事情:-D【参考方案3】:使用私有构造函数会阻止它被对象“外部”的任何东西创建。这通常用于singleton 模式之类的东西,它试图确保只存在一个类的实例。
This link also 提供了一些很好的描述...
【讨论】:
【参考方案4】:恕我直言,一些用法是
-
在单身
来自另一个构造函数..
【讨论】:
【参考方案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 类中,所有方法都是静态的,因此不需要创建其对象,因此在这种情况下使用私有构造函数
【讨论】:
根据***.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】:您可能需要私有构造函数的一些原因:
为了防止在对象之外实例化,在以下情况下:
单例
工厂方法
仅静态方法(实用程序)类
仅常量类
你也可以参考这段代码:
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# 中(例如)称为“静态类”的东西 - 换言之,实用程序类。实用程序类是一个助手类,它应该只包含静态成员。 (Math
和 System
在 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】:以下是私有构造函数的一些用途。
-
能够设计单例模式(所有对象仅共享一个对象实例)。
2.限制实例创建的数量。
3.防止子类化。
【讨论】:
以上是关于Java中私有构造函数有啥用?的主要内容,如果未能解决你的问题,请参考以下文章