`
dingjob
  • 浏览: 183644 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

《Effective Java》阅读体会之一--构建对象

阅读更多
 

 本书是JAVA 经典书籍之一,我看的是第二版的英文版(英文版比较便宜,哈哈),基于Java5的,值得一看:

我们先来了解下作者:

 

Joshua Bloch,是Google公司的首席Java架构师。是Jolt大奖的获得者。他曾是Sun公司的杰出工程师,和Transarc公司的高级系统设计师。Bloch曾带领团队设计和实现过无数的Java平台特性,包括JDK 5.0语言增强版和获奖的Java Collections Framework。他的著作还包括:《Java Puzzlers》、《Java Concurrency in Practive》等。

 

 

构建对象主要有七条规则,我认为比较重要的标识为红色

 

一. 在创建类的实例时,用静态的工厂方法代替构造方法:

注意这里的工厂方法不是工厂模式,相比构造方法有如下好处:

(1)命名更加直观,构造方法多个时不知道每个构造方法构造出来的对象有什么不同。

(2)结合单例模式可以避免对象重复创建,指向相同的内存块,可以节约内存。

(3)可以返回这个类的任何子类,这样就可以大大提高返回参数的灵活性,在策略模式中有较为明显的好处。

(4)可以避免实例化是很冗长的参数

一个例子,假如你要实例化一个Map

private static Map<String, PolicyStrategy> policyStrategyMap = new HashMap<String, PolicyStrategy>();

 如果HashMap 提供了这样一个方法,

  

public static <k,v> HashMap<k,v> newInstance(){
     return new HashMap<K,V>();
}

 这样上面的代码就可以修改为

private static Map<String, PolicyStrategy> policyStrategyMap = HashMap.newInstance();

遗憾的是JDK没有如此实现,你还是只能按照前面的来写

缺点所列的两条我认为有些牵强,不提了

 

总之,能用static方法的尽量用。

 

二.当参数太多时,考虑使用builder

这个规则比较好理解,当参数比较多时,调用时,要仔细看API,一个一个对照参数,很费事,特别是参数类型相同时

比如构建一个这样的对象   

A a = new A(1,2,3,4,5);

很难理解吧,那你可以只构造一二个参数剩下的通过set 方法设置,最后build对象

调用方看来是这样的

  

A a = new A(1,2),setScale(3).setSize(4),setAge(5).build()

 这个实体构建的代码应该很容易想到怎么写了吧。

总之,构建对象时,如果参数在5个以上,最好用这种方式。

 

三.用static 和 private的构造函数或者enum构建单例的对象

这个我们经常使用的,比如,一栋楼只有一部电梯:

public class Elivis {
      public static final Evlis Instance = new Elivis;
      private Elivis{};
      public void leaveTheBuilder(){……}
}

  

使用enum实现

public class Elivis {
      INSTANCE;
      public void leaveTheBuilder(){……}
}

 

使用enum更加好一些

 四.用私有的构造对象,强制不可实例化

 

这个比较常用,只是我们一般用的时候都只是构造私有的空构造方法,没有抛出异常,这里强调一下要抛出异常,防止类内部的构造

public class AA{
     private AA{
            throw new AssertionError();
     }
     ……
}

 

五.不创建多余的对象

   这一点非常重要,

   比如永远不要在程序里保有这样的代码

 

String s = new String("dingjob");

  这样每次调用时都会创建一个对象,可以这样升级它

  

String s ="dingjob";

 

这样在同一个虚拟机里运行的程序,如果恰好也要应用“dingjob”这个字符串,则引用的是同一个地址。在静态util类里面尤其要注意。

比如下面的例子,判断一个人是否在45 到65年之间出生。

public boolean isBothBetween45and64(Date birtDate){
    Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    gmtCal.set(1945,Calender.JANUARY,1,0,0,0)
    Date boomStart = gmtCal.getTime();
    gmtCal.set(1965,Calender.JANUARY,1,0,0,0)
    Date boomEnd = gmtCal.getTime();
    return birtDate.compareTo(boomStart )>=0&&
    birtDate.compareTo(boomEnd )<=0
}

 

应该这样改造

  

public class Person{
   private static final Date birtDate;
   private static final Date boomStart;
   private static fianl Date boomEnd;
static {
    Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    gmtCal.set(1945,Calender.JANUARY,1,0,0,0)
    Date boomStart = gmtCal.getTime();
    gmtCal.set(1965,Calender.JANUARY,1,0,0,0)
    Date boomEnd = gmtCal.getTime();

}
public boolean isBothBetween45and64(Date birtDate){
       return birtDate.compareTo(boomStart )>=0&&
    birtDate.compareTo(boomEnd )<=0
}
}

 实践证明,当有很多次调用时,后面的效率有可能是前面的程序效率的250倍

 

0
1
分享到:
评论

相关推荐

    Effective Java读书笔记.pdf

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

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,第二版发布于2008年。这本书旨在提供实用的编程指导,帮助开发者写出更高效、更可维护的Java代码。以下是对书中核心知识点的详细解读: 1. *...

    effective-java.pdf

    标题《effective-java.pdf》表明本文档是关于Java编程语言的实践指南,而描述说明了这是一份根据网上资源翻译后的HTML版本,经过转换形成的PDF文件,其内容可供参考。标签“java”指明文档内容与Java编程语言紧密...

    Effective Java第三版1

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,该书的第三版继续提供了关于如何编写高效、优雅、可维护的Java代码的指导。以下是基于给出的目录和部分内容提取的一些关键知识点: ### 第一...

    effective-java 配套代码

    配套代码`effective-java-examples-master`是书中示例代码的集合,用于直观地展示书中的各种编程技巧和原则。 在`effective-java-examples-master`中,你可以找到以下知识点: 1. **枚举(Enums)**: 书中强调了...

    effectiveJava课件分享

    在编程领域,特别是Java开发中,"Effective Java"是一本非常经典的书籍,由Joshua Bloch撰写,书中提出了一系列最佳实践和设计原则,以帮助开发者编写出更高效、更安全的代码。根据提供的标题和描述,我们将探讨三个...

    Effective Enterprise Java

    《Effective Enterprise Java》是一本深度探讨企业级Java应用开发的经典著作。这本书主要针对J2EE(Java 2 Platform, Enterprise Edition)平台,旨在提供一系列实用的编程指导和最佳实践,帮助开发者编写出高效、...

    effective java 读书笔记

    《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...

    《Effective Java》读书分享.pptx

    Builder 模式是一种构建对象的方法,不直接生成想要的对象,而是利用必要参数调用构造器(或者静态工厂)得到一个 builder 对象,然后在 builder 对象上调用类似 setter 的方法,设置可选参数,最后调用无参的 build...

    java翻牌源码-effective-java-3rd-chinese:有效的java-3rd-chinese

    effective-java-3rd-chinese 前51条:文章翻译来源地址: 现在全部章节已经更新完成 :提供更好的在线阅读版本 : 提供更快的访问速度 写在最前面 本 repo 从来没有授权过任何公众号进行发布转载,所有公众号的引流...

    jonykchen#effective-java-3rd-chinese#82. 文档应包含线程安全属性1

    如果这些假设是错误的,生成的程序可能缺少足够的同步(详见 78 条)或过度的同步(详见 79 条)。无条件线程安全 — 该类的实例是可变的,但是该类具有足够的内

    Effective.Enterprise.Java.中文版 高清pdf 下载

    《Effective Enterprise Java》是Java开发领域的一本经典著作,由著名技术专家Bill Venners编著,被广大Java开发者誉为“四大名著”之一。这本书深入探讨了在企业级Java开发中如何写出高效、可维护和易于理解的代码...

    Effective java 3 学习记录.docx

    Effective Java 3 学习记录 本学习记录主要介绍了 Effective Java 3 中的静态工厂方法和 Builder 模式两部分内容。 一、静态工厂方法 静态工厂方法是指返回类实例的命名规则,例如:from、of、valueOf、instance ...

    effective-java-3rd-chinese

    effective-java-3rd-chinese前51条:文章翻译来源地址:about this repository本来以为只是个直接搬运的活,实际上不是。主要工作如下:改进排版,原有博文排版不太优秀,根据markdown 排版指北重新排版。内容修改,...

    java逻辑思维笔试题-effective-java-3rd-edition:有效的Java第3版注释

    java逻辑思维笔试题Effective Java - 第三版笔记 章节索引 02 - 创建和销毁对象 03 - 所有对象通用的方法 04 - 类和接口 05 - 泛型 06 - 枚举和注释 07 - Lambda 和流 08 - 方法 09 - 通用编程 10 - 例外 11 - 并发 ...

    Effective Java.zip

    《Effective Java》是一本经典Java编程指南,作者是Joshua Bloch,这本书深入探讨了如何编写高质量、高效、可维护的Java代码。以下是对压缩包中各章节主要知识点的详细阐述: 1. **第2章 创建和销毁对象** - 单例...

    effective-go-zh-en-gitbook.rar

    《Effective Go》是一本由Google官方发布的编程指南,主要针对Go语言进行深入讲解,旨在帮助开发者写出更加高效、可读性更强的Go代码。这本书包含了多个实践性的建议和技巧,涵盖了Go语言的基础语法、并发机制、错误...

Global site tag (gtag.js) - Google Analytics