Effective Java 创建和销毁对象 1.考虑用静态工厂方法代替构造器

Effective Java


作者简介:Joshua Bloch是Sun公司的高级工程师,也是“Java平台核心组”的设计师。他设计并实现了获奖的Java Collections Framework和java.math软件包,并且对Java平台的其他部分也做出了贡献。Joshua是许多技术文章和论文的作者,他的关于抽象数据对象复制的博士论文获得过“ACM杰出博士论文奖”提名。他拥有哥伦比亚大学的学士学位和卡耐基-梅隆大学的博士学位。


java之父James Gosling 评价:我很希望十年前就拥有这本书。可能有人认为我不需要任何java方面的书籍,但我需要这本书。


四大名著
Java编程语言-------James Gosling(Java之父)
Java编程思想-------Bruce Eckel
Java 2核心技术-----Cay Horstmann
Effective Java-----Joshua Bloch


四大名著的网上有很多下载链接,中文版、英文版、源码。尽管如此我还是推荐直接买实体书。
对于英文阅读能力差的,一定要多看英文版,毕竟作者跟翻译不是同一个人,总会有出入;英文阅读能力好的直接看英文版,顺便过几遍中文版,意思向左的一定要自己验证。


创建和销毁对象 1.考虑用静态工厂方法代替构造器


使用静态工厂方法代替构造器,问题来了,什么是静态工厂方法?什么是构造器?


二者之间肯定有相同点,不然就不存在代替。

相同点:定义一个用于创建对象的接口,返回类的实例。


public class Person {


    static Person mPerson;


    public Person() {// 构造方法


    }


    public static Person getPerson01() {// 静态方法 01
        return new Person();
    }


    public static Person getPerson02() {// 静态方法 02
        if (mPerson == null) {
            return new Person();
        }
        return mPerson;
    }
}

相对于构造器,静态工厂方法的优缺点。

一.优点

1、静态工厂方法有名称。

构造器是Java一种规定写法,方法名就是类名,当构造器过多时,区别在于参数的多寡。

静态工厂方法 getPerson() ,可以随意命名,不过是在遵循命名规范的前提下。


2、静态工厂方法不必在每次调用它们的时候都创建一个新的对象。
 
构造器肯定是返回一个新的实例,而静态工厂方法02中当person为null才会返回新实例,不过这种写法不安全。

3、静态工厂方法可以返回原返回类型的任何子类型

public class Person {


public static final int KEY = 301;


private Person() {// 私有构造方法
}


public static Map mMap = new HashMap<>();//通过键值对保存接口对象


public interface Man {//接口
Person getPerson();
}


public static Person newPerson() {
return newPerson(KEY);
}


private static Person newPerson(int key) {
Man man = mMap.get(KEY);
if (man == null) {
return new Person();
}
return man.getPerson();
}




}
 
返回对象有很大的灵活性,只需要根据mMap的键。隐藏类的实现,适合于编写框架,框架会生成API,API就简洁化了。

4、静态工厂方法在创建参数化的类型实例的时候,它们使得代码变得更加简洁。在调用参数化类的构造器的时候


Map> m = new HashMap>(); //实例化 


定义静态工厂方法,编译器替你找到参数类型,也就是所谓的类型推导。
public static HashMap newInstance() {  
        return new HashMap();  
}  

Map> m = HashMap.newinstance();  

二、缺点

1、类如果不含公有的或者受保护的构造器,就不能被子类化。

这个就是Java机制,主要目的就是鼓励程序员复合而不是继承。


2、静态工厂方法与其他的静态方法实际上没有任何区别。

其实它就是静态方法,所以在API中,没有明确的标注。在API有构造方法专栏,而静态工厂方法只能在方法区域。

弥补缺点:习惯用名(复制的)

valueOf :不太严格的讲,这个方法返回的实例与它的参数具有相同的值。实际这只是做了一个类型转换。


of:valuefOf的一种简洁的替代,在EnumSet中使用并流行起来。


getInstance:返回的实例是通过方法的参数来描述的,但是不能说与参数具有同样的值。参于Singleton来说,该方法就没有参数,并总是返回唯一的实现。


newInstance:像getInstance一样,但newInstance能够确保返回的每个实例都与所有其他的实例不同。


getType:像getInstance一样,但是在工厂方法处于不同的类型的时候使用。Type表示工厂方法所返回的对象类型。


newType:像getInstance一样,但是在工厂方法处于不同的类型的时候使用。Type表示工厂方法所返回的对象类型。

你可能感兴趣的:(Effective,Java,Effective,Java)