什么';Java中私有构造函数的用法是什么?
我想知道私有构造函数在Java中有多有用。什么';Java中私有构造函数的用法是什么?,java,Java,我想知道私有构造函数在Java中有多有用。 在Java中使用私有构造函数的不同方式有哪些?当您不希望某个特定类被实例化时。作为其他答案的补充: 如果要创建单例类,需要隐藏构造函数,因此只能在内部调用它。使用私有构造函数会阻止对象“外部”的任何对象创建它。这通常用于模式之类的事情,在模式中,它试图确保只存在一个类实例 提供了一些很好的描述 有些用法是什么 单身汉 来自另一个构造函数 私有构造函数用于希望此类不能从外部初始化时 使用 案例1:创建sington类时 public class Si
在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...
下面是私有构造函数的一些用法
3。防止子类。
当你不希望某人做出你的类的实例(至少通过调用构造函数)。可能的复制-@ R Martinho Fernandes。我想对C++的这个问题也回答……然后你需要改变你的问题。C++ AmrutDange提供了一个替代自由的函数而不是实用类的解决方案,这样一来,对静态类的新方法是:代码> EnUM < /C>。java可以给出一个例子吗?<代码>公共枚举实用程序{;公共静态空格fn1()} } /代码> @ MakOtOutNikWOW。我以前没见过。非常有趣。是的,看到其他50个答案告诉你同样的事情:-根据我的想法,使用静态util类,你不需要创建私有构造函数。@ZuzooVn在java中,你不能创建静态类。您在评论中提到的问题是基于C语言“没有人可以从外部创建SingletonClass的对象。”如果外部执行SingletonClass s=SingletonClass.getInstance()?我认为您的示例中的好处是防止存在多个SingletonClass实例。