工具类的设计
1>工具类设计全都用public static 修饰
此时只需要使用工具类名调用工具方法
此时必须把工具类的构造器私有化,防止创建工具类的对象来调用静态方法
2>如果工具方法没有用static修饰
此时必须使用工具类的对象去调用工具方法
此时把必须工具类设计为单例模式的
一般出于简单考虑,首选第一种,如jdk中提供的工具java.Utils.Arrays包
公共静态方法
1. 构造器私有化
2. 提供public static方法作为工具方法
调用者直接使用 工具类名.工具方法名称完成调用
单例模式
最简单最常用的设计模式,单例的编写有N种写法
目的:保证在整个应用中某一个类有且只有一个实例(一个类在堆内存中只存在一个对象),单例设计模式的好处在于多个模块共享数据和工作方法
饿汉式
1. 必须在类中,自己先创建出一个对象
2. 私有化自身的构造器,防止外界通过构造器创建新的工具类对象
3. 向外暴露一个公共的静态方法用于返回单例对象(提供一个公共静态方法,用于统一的外界访问方式,返回事先创建好的实例)
4.把工具方法作为实例方法附着到单例上
**创建测试类测试单例设计模式**
1>单例访问
2>测试工具方法
懒汉式(延迟单例的创建)
1.私有化构造方法
2.事先创建好当前类的一个对象
3.提供一个公共静态方法(用于统一的外界访问方式,返回事先创建好的实例)
4..把工具方法作为实例方法附着到单例上
枚举法
1、使用EnumClass.values(),我们所用的常量可以一一列举出来,即枚举。
2、每一个常量可以附带信息和行为,封装性好方便使用。
包装类
基本类型的包装类位于java.lang包中,基本数据类型和包装类对应关系:
byte short int long float double char boolean
Byte Short Integer Long Float Double Character Boolean
总结:1>实际开发中,我们会用封装思维把一些数据作为字段封装在类中,并提供方法对这些数据进行操作 2>模拟的int包装类intWrapper既可以表示0,也可以表示null
3>IntWrapper提供了用于对封装的value进行进一步的操作
除了Integer和Character外,其他都是基本数据类型的首字母大写
装箱和拆箱
//装箱:把基本数据类型 转成 对于包装类的过程就称为把基本数据类型装箱
//拆箱:把包装类对象 转成 对应基本数据类型的过程就称为把包装类对象拆箱
//自动装箱:把基本数据类型直接赋值给对于包装类对象的过程
//自动拆箱:把包装类对象直接赋值给对应的基本数据类型
包装类的缓存设计
总结: 包装类为了提高性能,事先已经创建好了很多Integer对象,放入Integer类的cache缓存数组中,
如果开发者通过Integer.valueOf(n),创建对象时,n在[-128,127]之间的数,直接从缓存数组cache中获取,如果n的值超过了范围,直接new Integer(n);
Byte、Short、Integer、Long:缓存范围[-128,127];
Character:缓存范围[0,127];
BigDecimal
BigDecimal不能直接把赋值和运算操作,只有通过构造器传递数据,必须使用字符串类型的构造器,操作BigDecimal主要是加减乘除四个操作
精度控制 和 除不尽问题
// 1.保留位数和精度控制
// RoundingMode 舍入模式
// RoundingMode.HALF_UP 四舍五入(常用)
// 2. 除不尽问题
// 报错原因: 10.0 / 3.0 除不尽(3.333333333...333...)