java中私有构造函数的作⽤
1. 使⽤私有构造函数强化singleton属性。
⽅法⼀:公有的静态成员是⼀个final域,成员的声明很清
楚的表达了这个类是⼀个singleton。
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { }
public void leaveTheBuilding() {
System.out.println("This is singleton.");
}
public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
}
私有的构造函数仅被调⽤了⼀次,⽤来实例化公有的静态final域Elvis.INSTANCE; 由于缺少公有的或者受保护的构造函数,所以保证了Elvis 的全局唯⼀性。
⼀旦Elvis类被实例化之后,只有⼀个Elvis实例存在。
java接口有没有构造方法⽅法⼆:提供⼀个公有的静态⼯⼚⽅法,⽽不是公有的静态final域。该⽅式提供了更⼤的灵活性,在不改变API的前提下,可以把该类改成singleton或者⾮singleton的。
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() {
System.out.println("This is singleton.");
}
public static void main(String[] args) {
Elvis elvis = Instance();
elvis.leaveTheBuilding();
}
}
总结:第⼀种⽅法效率稍微⾼⼀些,采⽤第⼀种⽅法实现singleton后,就没有改变的余地了,当你想把该类改成⾮singleton,显然是不⾏的了。
所以,除⾮确实该类是⼀个singleton,那就⽤第⼀个⽅法吧。⽤第2种⽅法的时候,假如该类实现了serializable接⼝,那应该重写readResolve()⽅法,
否则再反序列化的时候是会产⽣⼀个新的实例,这与singleton相违背了!
2.通过私有的构造函数强化不可实例化的能⼒.
在⾯向对象程序设计中,假如存在太多只有静态属性和静态⽅法的类;那么,⾯向对象的思想可能在这会损失殆尽。
但是,并不能说⾯向对象的程序中就不应该出现只有静态属性和静态⽅法的类,相反,有时候我们还必须写这样的类作为⼯具类。
这样的类怎么实现呢?有⼈可能会把该类定义成抽象类(Abstract class),的确,抽象类是不可以实例化的,但是别忘了还有继承,
继承了抽象类的⼦类在实例化时候,默认是会先调⽤⽗类⽆参数的构造函数的(super();),这时候,⽗类不是也被实例化了嘛?
其实我们可以这样做,把该类的构造函数定义为私有的(private),⽽类的内部⼜不调⽤该构造函数的话,就成功了。
这样带来的后果就是该类成了final的,不可能再被任何类继承了,要被继承,得提供⼀个公有(public)的或者保护(protect)的构造函数,这样才能被⼦类调⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。