本篇文章介绍下Java,私有构造函数的使用。
Java私有构造函数的使用
当我们学习Java的时候,我们接触到的构造函数的权限修饰符都是public,比如,
public class Test {
public Test() {
}
}
}
我们,知道构造函数的用途是创建一个对象,并返回。比如,
Test instance = new Test();
如果你很了解java的权限修饰符的话(若不是,请移步百度搜索),你是否会疑问,构造函数能否是private的呢?
答案是yes。
由于private的缘故,被private修饰的构造函数无法在其他类中调用,也就是该类无法在其他类中实例化。那不仅要问,那还要构造函数做什么?
既然,Java允许构造函数的私有化,那肯定是有一定的道理。我们简要介绍其两种情景。
单例模式
如果你了解过设计模式,那你一定会知道单例模式,这是最初级的设计模式之一。
一个最简单的单例模式如下,更复杂的单例模式,请参考[http://blog.csdn.net/u014088294/article/details/49838831]
public class Singleton {
private static Singleton instance;
private Singleton() {
// .......//
}
public Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
单例模式主要有3个特点,
1. 类的内部包括一个类的实力,并且为static类型
2. 构造函数为私有
3. 通过提供一个获取实例的方法,比如getInstance,该方法也为static类型。
调用的时候,我们可以通过
Singleton instance = Singleton.getInstance();
来得到其实例化。
你也许会问,为什么要用单例模式呢?这是因为, 很多时候,我们只需要一个对象就可以了,不希望用户来构造对象,比如线程池,驱动,显示器等。如果把构造函数私有,那么很多程序都可以得到其实例,将会带来混乱。
防止实例化
私有构造函数的第二个用途,就是防止实例化。你又要问了,一个类,不能实例化,还要它有啥用?!
哈哈,那是你忘了static关键词了,static的意思是静态,什么是静态呢,如果一个变量或方法设置为static,那么它就不依赖其所在的对象。
一个简单的例子,
public class StaticTest {
public static int a;
public int b;
public static void menthoA() {
// ...//
}
public static void main(String[] args) {
int c = StaticTest.a;
StaticTest.menthoA();
StaticTest instance = new StaticTest();
int d = instance.b;
}
}
由于a为static类型,所以我们可以直接通过类名StaticTest.a来获取到a,对于方法menthoA而是,但是对于非static变量和方法, 我们必须实例化才能访问,比如变量b。
当然了,我们而可以通过instance.a来访问a,不过这样是不是显的多余呢?通常我们不这么做。
上面的例子,是存在构造函数,考虑如下情形,我们有一个工具类Utils,里面含有很多静态函数或者静态变量,由于静态的原因,我们完全可以通过类名来访问,这样,我们就没有必要实例化它们,所以我们可以将其构造函数设置为私有,这样就防止用户滥用。
在Java的工具类中,有很多就是利用这种方法。