《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倍

 

### 回答1: 《Effective Java第三版》是由Joshua Bloch所著的一本Java编程指南。这本书是基于第二版的更新版本,目的是给Java程序员提供一些最佳实践经验,以编写高效、可维护和可靠的Java代码。 这本书共分为15个章节,每个章节都讲解了一个与Java开发有关的重要主题。比如,章节一讲述了使用静态工厂方法代替构造器的优点,章节二则介绍了如何用Builder模式来构建复杂的对象。此外,书还提及了Java对象的等价性、覆盖equals方法和hashCode方法、避免创建不必要的对象、使用泛型、枚举、lambda表达式等等。 《Effective Java第三版》通过具体的代码示例和清晰的解释来说明每个主题的关键概念,使读者能够更好地理解和应用。此外,书还提供了一些实用的技巧和技术,例如避免使用原始类型、尽量使用接口而非类来定义类型等。 总的来说,这本书提供了很多实用的建议和技巧,可以帮助Java开发者写出高质量的代码。无论是初学者还是有经验的开发者,都可以从受益匪浅。无论你是打算从头开始学习Java编程,还是已经有一定经验的开发者,这本书都是值得推荐的读物。 ### 回答2: 《Effective Java 第三版》是由Joshua Bloch 所著的一本Java编程指南,是Java程序员必读的经典之作。该书共包含90个条目,涵盖了各种Java编程的最佳实践和常见问题的解决方法。 本书分为多个部分,每个部分都侧重于一个特定的主题。作者探讨了Java编程的各种问题和挑战,并提供了解决方案和建议。这些建议包括如何选择和使用合适的数据结构和算法,如何设计高效的类和接口,如何处理异常和错误,以及如何编写可读性强的代码等等。 《Effective Java 第三版》还关注了Java编程的性能优化和安全性问题。作者强调了遵循Java语言规范、使用标准、防范常见安全漏洞等重要原则。此外,本书还介绍了Java 8及其后续版本的新特性和用法,如Lambda表达式、流式编程和Optional类等。 这本书的特点之一是每个条目都独立于其他条目,可以单独阅读和理解。每个条目开头都有一个简洁的总结,让读者能够快速掌握主要观点。此外,书还有大量的示例代码和解释,帮助读者更好地理解和运用所学知识。 总的来说,《Effective Java 第三版》是一本非常实用和全面的Java编程指南。它适用于各个层次的Java程序员,无论是初学者还是有经验的开发人员,都可以从获得宝贵的经验和知识。无论是编写高质量的代码、优化性能还是确保安全性,这本书都是一本不可或缺的参考书籍。 ### 回答3: 《Effective Java 第3版(文版)》是由 Joshua Bloch 所著的一本关于使用 Java 编程语言的指南书。该书是对 Java 语言的最佳实践的详尽描述,为高级 Java 开发人员提供了许多实用的建议和技巧。 该书的主要内容包括Java 语言的优雅编程风格、类和接口的设计、Lambda 表达式和流的使用、泛型、异常和并发编程等方面的最佳实践。 在《Effective Java 第3版(文版)》,许多传统的 Java 开发的陷阱、常见错误和不良习惯都得到了深入的剖析和解答。它不仅提供了可供开发人员参考的示例代码,还解释了为什么某种方式是有问题的,以及如何更好地进行改进。 该书的深度和广度非常适合正在努力提高 Java 编程技能的开发人员。它涵盖了多个关键领域,为读者提供了在实际项目解决常见问题的方法和思路。 此外,《Effective Java 第3版(文版)》还介绍了最新版本的一些特性和改进。例如,它详细说明了如何正确地使用 Java 8 新增的 Lambda 表达式和流,以及如何充分利用 Java 9、10 和 11 的新功能。 总之,这本书Java 开发人员必备的指南之一。通过深入理解和应用书实践建议,读者可以更加高效地编写、优化和维护 Java 代码。无论是想提升职业技能还是在项目减少错误和问题,这本《Effective Java 第3版(文版)》都是一本非常有帮助的参考书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值