java使用私有构造器 避免多余多对象的创建

构造器作为Java类的一个特殊的成员同样可以设置关键字来控制其访问权限。在大多数情况下,我们一般把构造器设置为公有成员,即public的,在默认情况下,如果不写任何关键字,其访问权限也是public。这样,在我们新建一个类的对象的时候,构造器会创建对象后被自动调用,发生在其他类成员被设置为默认初始值之后,当然如果有字段初始器和初始化块的话,构造器的调用会发生在此之后。构造器的主要作用是在new将对象的引用返回之前初始化对象。

私有构造器的类究竟有什么作用呢?这样的类在实际应用中最常用的是作为工具类,如字符串的验证、枚举转换之类的,通常只做成静态接口被外部调用即可。

Java私有构造器:使用private关键字声明的构造函数。

由于类的构造函数时私有的,所以此类不能被实例化,同时也不能被继承

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);

    }

}

你可能感兴趣的:(effective,java学习)