Java私有构造器

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);
    }
}
时间: 2024-10-15 19:06:58

Java私有构造器的相关文章

《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性

Singleton指仅仅被实例化一次的类.一般用来搞那些创建非常耗资源或者要求系统中只能有一个实例的类.这个非常常用.记得以前实习面试的时候就有这个面试题.一般采用的方法是将构造器私有化,然后提供一个static变量,再提供一个static的public方法用来返回static实例: //Singleton with static factory public class Elvis { private static final Elvis INSTANCE = new Elvis(); pri

【代码优化】私有构造器使用及对象创建优化

1.使用私有构造器或者枚举类型强化singleton 1>单例模式---私有构造器,提供一个公有的成员是一个静态工厂方法: public class SingleTon{ private static final  SingleTon single=new SingleTon(): private SingleTon(){ } public static SingleTon getInstance() { return single: } } 工厂方法的优势一在于它提供了灵活性:在不改变其他ap

第4条:通过私有构造器强化不可实例化的能力

当需要编写只包含静态方法和静态域的类时,像是java.lang.Math,java.util.Arrays,把基本类型的值或者数组类型上的相关方法组织起来,或者像java.util.Collections,把实现特定接口的对象上的静态方法组织起来. 这样的工具类不希望被实例化,实例对它没有意义. 企图通过将类做成抽象类来强制该类不可被实例化,行不通.因为该类可以被子类化,并且子类可以被实例化. 我们把类的构造器显式声明为私有的,保证在类的外部不能被访问. public class Utility

java中构造器(Constructor)

构造器是一个创建对象时被自动调用的特殊方法,为的是初始化.构造器的名称应与类的名称一致. 当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null. 构造器可以改变这种默认的初始化. 构造器的作用:是创建Java对象的重要途径,是不是说构造器完全负责创建java对象? 答:是创建java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该类的对象,但这个对象并不是完全由构造器负责创建的. 首先要注意的

java中 构造器与void

在java中,构造器与void都没有返回值, java编程思想中这么解释构造器的: 构建器属于一种较特殊的方法类型,因为它没有返回值.这与 void 返回值存在着明显的区别.对于void 返回值,尽管方法本身不会自动返回什么,但仍然可以让它返回另一些东西.构建器则不同,它不仅什么也不会自动返回,而且根本不能有任何选择.若存在一个返回值,而且假设我们可以自行选择返回内容,那么编译器多少要知道如何对那个返回值作什么样的处理. 自己运行的例子: public class SimpleConstruct

第二章:创建和销毁对象。ITEM3:用私有构造器或者枚举类型强化Singleton属性。

声明一个Singleton类的3种方法: package com.twoslow.cha2; /** * 可以通过AccessibleObject.setAccessible(),通过反射机制调用私有构造器. * @author sai * */ public class Singleton01 { private Singleton01(){} public static final Singleton01 INSTANCE = new Singleton01() ; private Obje

Java私有构造函数不能阻止继承

下面是一个调用已经私有化的单列的函数的列子. 这里用了静态内部类,关键就是静态内部类可以访问外部类的私有构造函数. 这种算是变种继承吧.前提是可以在原来的单列类里添加代码. class Single { private Single(){                System.out.println("Single");        }                public void runSingleMethod()        {                Sy

java中构造器(Constructor)

大部分内容转自:http://tech.it168.com/j/2006-05-18/200605181021879.shtml 构造器是一个创建对象时被自动调用的特殊方法,为的是初始化.构造器的名称应与类的名称一致. 当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null. 构造器可以改变这种默认的初始化. 构造器的作用:是创建java对象的重要途径,是不是说构造器完全负责创建java对象? 答:是创建java

第四条:通过私有构造器强化不可实例化的能力

我们在开发中经常会去做一些工具类,这些类中的方法和变量都是static的.而这样的工具类是不希望呗实例化的.然后我们知道jdk会在无构造器的时候,自动的提供一个无参数的缺省构造器.该构造器就会提供给用户一个创建改类对象的接口,因而我们在工具类中会将此构造函数显示化私有化: public class UtilityClass{ private UtilityClass(){ // 用来避免在类内不小心的调用该构造器 throw new AssertError(); } ...... } 该条建议,