Java私有构造器:使用private关键字声明的构造函数。由于类的构造函数时私有的,所以此类不能被实例化,同时也不能被继承。《Effective Java》第三条:用私有构造器或者枚举强化Singleton属性。所谓Singleton属性是指仅仅被实例化一次的类。第四条:通过私有构造器强化不可实例化的能力。在Java中实现Singleton有两种方式:
public
class
Elvis {
public
static
final
Elvis INSTANCE =
new
Elvis();
private
Elvis() {}
}
public
class
Elvis {
private
static
final
Elvis INSTANCE =
new
Elvis();
private
Elvis() {}
public
static
Elvis getInstance() {
return
INSTANCE;}
}
方法一:私有构造函数只能被调用一次,用来实例化公有的静态final域Elvis.INSTANCE,一旦Elvis被实例化,只会存在一个Elvis实例(享有特权的客户端可以借助AccessibleObject.setAccessible方法通过反射机制调用私有构造器);
方法二:使用静态方法getInstance返回对同一个对象的引用,永远不会创建其他Evlis实例;
为什么需要私有构造器,如果类不能被实例化该怎么使用这个类的方法?
私有构造器的存在可以让某些类不能被实例化和子类化,这些类通常是一些工具类,例如java.lang.Math等,访问这些类的方法我们可以定义公有的静态方法来实现,如A.methon()
public
class
A {
private
A() {}
public
static
void
methon() {}
}
java.lang.Math中私有构造器的使用,可以看到Math类被定义为final的,使用了private的构造函数,它的方法都是static的,所以调用其方法只需要Math.sin(x)即可:
public
final
class
Math {
private
Math() {}
public
static
final
double
E =
2.7182818284590452354
;
public
static
final
double
PI =
3.14159265358979323846
;
public
static
double
sin(
double
a) {
return
StrictMath.sin(a);
// default impl. delegates to StrictMath
}
public
static
double
cos(
double
a) {
return
StrictMath.cos(a);
// default impl. delegates to StrictMath
}
public
static
double
tan(
double
a) {
return
StrictMath.tan(a);
// default impl. delegates to StrictMath
}
......
public
static
float
scalb(
float
f,
int
scaleFactor) {
return
sun.misc.FpUtils.scalb(f, scaleFactor);
}
}