引言:在java中一个类的构造方法一般都是公共的public,毕竟你创建类就是为了能够让别人声明出该类的一个实例对象,如果使用private对构造方法进行修饰的话就使用者就无法通过构造方法创建该类的一个实例对象了。但是私有的构造方法仍然有其用途。

具体可以使用在下面几个方面:

1. 用在工具类中

在java.lang.Math类中可以看到如下代码

private Math() {}

并且在Math类中没有其他构造方法,因此用户无法自己创建一个实例化的Math对象。从Math类的源码中可以发现里面的成员属性和方法全都是静态的,这个时候声明Math实例可能就没有什么必要,而且如果用户创建了对象还占用内存。如果用户仍然声明了实例对象,使用private修饰符对构造方法进行修饰可以在编译器就进行报错,强制用户不能创建该对象。相同的还有例如Arrays类,Objects类等(这些类都在java.util包中)其构造方法都是用private进行修饰。因此在工具类中可以仿造Math类中的用法,将构造方法声明为私有的,不让用户进行类的实例化。

2. 用在枚举类型中

我们知道枚举类型中的每个值都是一个枚举实例,并且不能通过new对象字来创建一个枚举对象的实例。其调用方式一般入如下:

枚举类型名.枚举成员名

这样就可以获取一个枚举实例,如果我们想获取枚举变量对应的值可以使用如下类似的代码:

public enum Direction{
	EAST("东"),SOUTH("南"),WEST(“西),NORTH("北");
	private String name;
    // 声明一个私有的构造方法
	private Direction(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}

通过这种方式,例如我们在调用Direction.EAST时,可以看成是new Direction("东")实例,当然这并不是我们手动实现的,而是java内部帮我们实现好的。这也是使用private私有构造的用途之一,总之也是为了不让用户手动的创建一个枚举对象实例。

3. 用在单例模式中

私有构造方法的另外一种更常用的方法是用在给一个类创建单例模式中。

单例模式:在程序的运行中一个类有且仅有一个对象存在

单例模式的使用场景很广,例如用在创建一个单个的app对象中,或者用在各种框架的设计当中。

单例模式的实现方式有如下几种:

  • 懒汉模式
public class App {  
    private static App instance;  
    // 私有构造
    private App (){}  
    public static App createApp() {  
        // 如果静态实例还没有被创建就新建一个对象,此后不再新建
        if (instance == null) {  
            instance = new App();  
        }  
        return instance;  
    }  
}

从上述代码中可以看到用户无法通过new App()来创建一个实例,则只能通过createApp()方法获取全局的一个静态实例对象,做到了延迟加载的效果,但不是线程安全的。

  • 饿汉模式
public class App {  
    private static App instance = new App();  
    // 私有构造
    private App (){}  
    public static App createApp() {  
        return instance;  
    }  
}

这是另外一种实现单例模式的方法,这种方法直接创建了一个静态对象,起不到延迟加载的效果,但是是线程安全的。

总结:上面的三种方式中,之所以使用private声明一个私有的构造器,其主要目的就是为了不让用户创建新的实例对象,从而达到相应的想要的效果~