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

Java私有构造器的更多相关文章

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

    Singleton指只被实例化一次的类.一般用来搞那些创建很耗资源或者要求系统中只能有一个实例的类. 这个很经常使用.记得曾经实习面试的时候就有这个面试题. 一般採用的方法是将构造器私有化,然后提供一 ...

  2. Java 构造器 通过私有构造器强化不可实例化的能力

    只有当类不包含显式的构造器时,编译器才会生成一个公有的.无参的缺省构造器.只要让一个类包含私有构造器,这个类就不能被实例化了.示例: // 工具类 public class UtilityClass ...

  3. 《Effective Java》-——用私有构造器或者枚举类型强化Singleton属性

    Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统.使类成为Singleton会使它的客户端测试变得十分困难,因为无法给Si ...

  4. Effective Java 之 --- 用私有构造器或者枚举类型强化Singleton属性

    Singleton指仅仅被实例化一次的类,通常用来代表那些本质上唯一的系统组件,实现Singleton有三种方法: 1)公有静态成员是个final域,享有特权的用户可以调用AccessibleObje ...

  5. 【读书笔记 - Effective Java】04. 通过私有构造器强化不可实例化的能力

    工具类(utility class)不希望被实例化,比如只包含静态方法和静态域的类.为了这个目的,需要让这个类包含一个私有构造器. // 私有构造器示例 public class UtilityCla ...

  6. 【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性

    实现Singleton(代表本质上唯一的系统组件)的三种方法: 1. 保持私有构造器,导出公有的静态成员,客户端访问该类的唯一实例. 2. 保持私有构造器,公有的成员是静态工厂方法. 3. 单元素的枚 ...

  7. 用私有构造器或者枚举类型强化Singleton属性

    1.Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,如窗口管理器或者文件系统.使类称为Singleton会使它的客户端调试变的十分困难,因为无法给S ...

  8. 用私有构造器或枚举类型强化Singleton

    Singleton指只有一个实例的类,只能被创建一次. 在Java1.5之前实现Singleton有两种方式,都是将构造器设为private并导出公有的静态成员实例. 第一种方式将公有的静态成员实例设 ...

  9. 创建和销毁对象——用私有构造器或者枚举类型强化Singleton属性

    参考资料:<Effective Java>.<Java核心技术 卷1>.https://www.cnblogs.com/zhaosq/p/10135362.html 基础回顾 ...

随机推荐

  1. word-break:break-all和word-wrap:break-word的区别

    了解word-break属性 /* 关键字值 */ word-break: normal; word-break: break-all; word-break: keep-all; /* 全局值 */ ...

  2. [JS] 面向对象的5种写法和拓展JS对象的写法

    面向对象的JAVA  最开始当然是对象的定义了 收集了以下的五种写法 //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; C ...

  3. 笔记8:winfrom连接数据库DBHelp

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  4. orcl

    Class.forName("orcle.jdbc.driver.OracleDriver"); Connection conn=DriverManager.getConnecti ...

  5. 《JavaScript权威指南》读书笔记(二)

    日期:2015-12-04 js 的原型::闭包:闭包这是个相当复杂的东西...现在初步理解:    http://segmentfault.com/a/1190000000652891    闭包有 ...

  6. UserAgent:通过浏览器获取用户浏览器等信息

    User Agent的含义      User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏 ...

  7. Objective-C:Foundation框架-概述

    iOS的整体架构(以iOS8为例)图如下: 从Cocoa Touch到Core OS下面四层包含了开发iOS应用程序所用到的所有API(第三方框架也是基于这几个层的).每个层又都包含了许多框架.框架就 ...

  8. cmd扩展路径

    在命令行窗口中,输入for /? 即可得到如下参数解释==== 对一组文件中的每一个文件执行某个特定命令. FOR %variable IN (set) DO command [command-par ...

  9. Python的神奇方法指南

    参考:http://article.yeeyan.org/view/311527/287706

  10. 使用ContentResolver添加数据、查询数据

    import java.util.ArrayList;import java.util.HashMap;import java.util.Map; import android.os.Bundle;i ...