静态方法代替构造器-effectiveJava读书笔记

简介: <p>一般可能用到的地方:</p> <p>1. Boolean.valueOf(true)</p> <p>2. BigInteger.probablePrime(int length, Random)</p> <p>3. 单例<span style="white-space:pre"> </span>通常方法为getInstance</p> <p><span style="whit

一般可能用到的地方:

1. Boolean.valueOf(true)

2. BigInteger.probablePrime(int length, Random)

3. 单例 通常方法为getInstance

这里还有些其他的习惯用法,也总结一下:

valueOf()    通常用来做类型转换,或者封装

of    valueOf的简洁形式

getInstance 单例

newInstance 每次调用返回不同的实例

getType 与getInstance类似,但是是工厂方法的形式,要获取的类不是自己,一般是一个接口的实现,但是接口不能含有static方法,于是把接口的这种需求放到一个接口s的类中,加入static类型来获得接口的实现。

newType 参照getType和newInstance的定义。

4. 工厂

在没有spring之前,通常是使用静态方法工厂来进行实例管理的,比如业务场景,保险公司的系统要根据不同的险种来计算赔款,可能就会用如下的代码结构:

interface InsuranceClaimCalculateAble{
	public double calculate(double realPay);
}

class InsuranceClaimCalculateFactory{
	private final static int TYPE_SANZHE = 0;
	private final static int TYPE_JIAOQIANG = 1;
	public static InsuranceClaimCalculateAble getCalculateByType(int type){
		if(TYPE_SANZHE == type){
			return new SanzheInsuranceClaimCalculate();
		}
		
		if(TYPE_JIAOQIANG == type){
			return new JiaoqiangInsuranceClaimCalculate();
		}
	}
}

请忽略没有使用枚举表示类型,没有使用配置文件及ClassLoader的方式来加载类等等。


5. JDBC

JDBC是Java提供的数据库链接的框架,不同的数据库厂商可以根据自己的情况进行实现,然后接入到整个框架中来。通常会按照如下的逻辑:

Class.forName("com.mysql.jdbc.Driver");
		Connection con = DriverManager.getConnection("");
这个实际上相当于

// mysql Driver中的代码:把自己进行注册
static {
			DriverManager.registerDriver(new Driver);
		}

// 在DriverManager.getConnection中的代码:
return driver.connect()
这里跟静态方法代替构造器相关的主要是
DriverManager.getConnection
这个方法,但是整体运用起来是一个很好的服务提供者及注册框架,可以在写框架的时候不用考虑有多少种自己的实现。

6. Map<String, List<Map<String, String>>> map =  Colleactions.emptyMap()

正常情况下我们new一个map需要如下的代码:

Map<String, List<Map<String, String>>> map =  new HashMap<String, List<Map<String, String>>>();

但是如果给Map做一下改变,我们就能简化这个声明:

 Map<String, List<String>> map = new HashMap<String, List<String>>(); 变为:
                  加上这个构造器:
        public static <K, V> MyMap<K,V> newInstance(){
            return new MyMap<K, V>();
        }  
 //就可以使用这句来得到对象了:
Map<String, List<String>> map = MyMap.newInstance();


以上使用静态方法而不使用构造器我们得到了这样的好处,同时也是编码中经常可能用到的最佳实践。

1. 不会创建重复的值,使用valueOf或者是单例的这种情况

2. 有名字,可以更清晰的表达

3. 更短的代码

4. 可以返回子类,这样就可以更好的使用面向接口的编程

5.  可以把本来可能逻辑上位置应该在接口中的代码写到Types的类中。


同时一些不好的地方:

1. 跟其他的静态方法没有什么区别,不知道是工具类方法还是用作创建对象的方法


相关文章
|
4月前
|
存储 Java 程序员
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
80 4
|
5月前
|
Java
Java面向对象 ( 类与对象 | 构造方法 | 方法的重载 )
Java面向对象 ( 类与对象 | 构造方法 | 方法的重载 )
|
7月前
|
Java 编译器
Java面向对象编程:构造方法详解
Java面向对象编程:构造方法详解
91 2
|
6月前
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
35 0
|
Java
Java面向对象中 this关键字的详解
Java面向对象中 this关键字的详解
71 0
|
Java
Java面向对象中 static关键字的详解
Java面向对象中 static关键字的详解
54 0
|
Java
Java面向对象中(super关键字)的详解
Java面向对象中(super关键字)的详解
58 0
|
Java
Java面向对象基础3——构造方法及this关键字
Java面向对象基础3——构造方法及this关键字
155 0
Java面向对象基础3——构造方法及this关键字
|
Java
java学习第十三天笔记-面向对象247-继承中成员方法和成员变量的特点-成员方法的访问特点
java学习第十三天笔记-面向对象247-继承中成员方法和成员变量的特点-成员方法的访问特点
94 0
java学习第十三天笔记-面向对象247-继承中成员方法和成员变量的特点-成员方法的访问特点
|
Java
java学习第十三天笔记-面向对象245-继承中成员方法和成员变量的特点-成员变量的访问特点
java学习第十三天笔记-面向对象245-继承中成员方法和成员变量的特点-成员变量的访问特点
97 0
java学习第十三天笔记-面向对象245-继承中成员方法和成员变量的特点-成员变量的访问特点