您的位置:首页 > Web前端

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

2017-08-23 12:13 495 查看
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<Integer, Man> 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<String, List<String>> m = new HashMap<String, List<String>>(); //实例化 

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

        return new HashMap<K, V>();  
}  

Map<String, List<String>> m = HashMap.newinstance();  

二、缺点

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

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

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

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

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

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

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

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

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

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

newType:像getInstance一样,但是在工厂方法处于不同的类型的时候使用。Type表示工厂方法所返回的对象类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐