`

读《Effective Java》总结

    博客分类:
  • java
阅读更多

   最近看了一本书,《Effective Java》中文版,内容非常好,但作者有些地方没有讲的太明白,例子也举的不是很丰富,或许是我水平太低吧,第一次读完感觉云里雾里的。那我反复看了好几次,终于有点头绪。我把自己看过的和自己的理解记下来分享出来,一是加深一下自己的记忆、整理一下自己的思路;二是大家一块学习,如果有什么不对的地方请大家指点纠正。有些我不是很明白的地方会写出来希望能够得到大家的解答。

    书中给总结了78点,今天先写第一点:[b]考虑用静态工厂方法代替构造器。[/b]

    在Java中,我们提供实例最常用的方法就是提供一个公有的构造器。那还有一种方法:在类中提供一个共有的静态工厂方法(static factory method),它只是一个返回类的实例的静态方法。(注:这里说的静态工厂方法和设计模式中讲的不是一回事)。

一个简单的例子:

[code="java"]

 

public static Boolean valueOf(Boolean b){

    Return b?Boolean.TRUE:Boolean.FALSE;

}

 

[/code]

当你看到这时候会问为什么要用这种方法?有什么好处呢?

书中给总结了几点,我直接抄下来。

第一:静态工厂方法与构造器不同的第一大优势在于,它们有名称。

   怎么理解这点呢?那举个例子:构造器BigInteger(int,int,Random) 返回的BigInteger可能为素数,如果用BigIneger.probablePrime的静态工厂方法就很清楚了。建议大家查看BigIneger的源码,对你的理解很有帮助。

在一个类中我们有时候会写好几个构造器,只不过它们的参数个数、参数类型、参数顺序有所不同。我们也会经常调用这样的API,你肯定也纠结过到底用哪个好呢?常常会调用了错误的构造器。如果这些构造器的代码还没有文档和注解时你会有想掐死写这个API的作者冲动。

由于静态工厂方法有名称,所以就不会有上面的麻烦了。当然在你使用这样的方法时要非常慎重的选择名称以便突出它们之间的区别,方便客户端的调用。

 

第二:静态工厂方法不必在每次调用它们的时候都创建一个新的对象。

这点主要是针对不可变类来讲的,可以使用预先构建好的实例或者将构建好的实例缓存起来重复利用,从而避免创建不必要的重复对象。例如:Boolean.valueOf(boolean b)方法。如果经常请求创建相同的对象,但是创建对象的代价很高,那这项技术可以极大的提升性能。

 

[color=red]第三:静态工厂方法可以返回原返回类型的任何子类型的对象。(这一点我不是很明白,求解!!!!)[/color]

 

第四:静态工厂方法在创建参数化实例的时候,它们使代码变得更加简洁。

     直接上代码说明:

[code="java"]

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

[/code]

 

这段代码应该好多人都用过,有没有觉的很麻烦,而且看的也不爽。

如果HashMap中有下面的方法:

[code="java"]

  public static <k,v>hashMap<k,v> newInstance(){

return new HashMap<k,v>();

}

 

[/code]

那我们调用的时候

[code="java"]

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

[/code]

 

是不是很简洁呢?

 

当然静态工厂方法也有它的缺点:

 

静态工厂方法的主要缺点在于,类如果不包含共有的或者受保护的构造器,就不能被子类化。

静态工厂方法的第二个缺点在于,它们与其他的静态方法实际上没有任何区别。在API文档中没有像构造器那样明确的标识出来,所以对于只提供静态工厂方法而没有构造器的类来说,要想查明如何实例化一个类是很困难的。

不过书中给出的建议:我们在使用静态工厂方法时可以通过规范化命名来弥补这一劣势。下面是惯用的名称:

valueOf

of

getInstance

newInstance

getType

newType。

 

第一次写这么长的博客,有什么意见或建议大家提出来,今天就先写到这。

分享到:
评论

相关推荐

    Effective Java读书笔记.pdf

    Effective Java是一本关于Java编程语言的经典书籍,本笔记主要总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点。 一、Java语言的发展历程 Java语言的发展可追溯到1991年,当时由...

    读书笔记:Effective Java 中文版(第2版)总结 (美)Joshua Bloch 著.zip

    读书笔记:Effective Java 中文版(第2版)总结 (美)Joshua Bloch 著

    2021年EFFECTIVEJAVA读书笔记.docx

    本文总结了Effective Java 中关于枚举与注解的知识点,涵盖了枚举类型的优点、使用指南、避免使用 int 常量、使用 EnumSet 和 EnumMap 等。 枚举类型的优点 枚举类型提供了编译时类型安全、自动命名空间隔离、可以...

    Java学习资料汇集(书籍、文章、总结)

    《Effective Java》关注Java开发的最佳实践和避免常见陷阱,有助于编写高效、可读的代码。《Java并发编程实战》则深入讲解并发编程,这对于在多核和分布式系统中工作的Java程序员至关重要。 除了书籍,系列文章也是...

    Java心得 学JAVA必看

    此外,还可以参考一些经典书籍,如《Effective Java》等。 #### 18. 善用搜索引擎 遇到问题时,学会利用搜索引擎查找答案是非常重要的。Google等搜索引擎提供了丰富的资源,只需输入关键词就能找到大量相关的信息。...

    Java 集合(Collections)总结

    第一次系统的阅读理解Java Collections Framework的源码,已经粗略的学习完了,做个简单的总结。首先把资料放置在第一位,想系统学习的主要原因在工作之余想自学点东西,看了master24 的博文之后,感觉有必要把Java...

    JAVA课程设计完整版.doc

    2. **《Effective Java》**:深入探讨Java编程的最佳实践。 3. **《Java并发编程实战》**:针对Java并发编程的深入讲解。 通过这些书籍的学习,可以进一步提升Java编程水平,为未来的软件开发工作做好准备。

    C#基本总结

    它结合了C++和Java的优点,同时具备现代化的语言特性,如垃圾回收机制,使得开发者可以更加专注于业务逻辑而不是底层内存管理。 ##### 1.1 C#的学习资源 - **环境准备**:本文写作初期提及商用C#编译器尚未发布,...

    C语言(都是一些小知识)

    - 推荐的其他学习资源包括:**《Effective C++》**、**《More Effective C++》**、**《Exceptional C++》**等。 **4. C语言与其他语言的比较:** - C语言相比于其他语言如Java、Python等更接近硬件层面,因此在性能...

Global site tag (gtag.js) - Google Analytics