Effective Java Reading Notes - 1

最近感觉自己对于Java越来越陌生了,遂看EffectiveJava来温习一下。这本书就是一个清单,分为90个item。

Introduction

简介里面就简单说明了一下本书的重点,重点不在于如何写出高性能的Java代码,而是写出clear,correct,usable,robust,flexible,maintainable的代码。

Creating and Destroying Objects

Item 1: Consider static factory methods instead of constructors

获取一个类的实例的传统方式是提供构造方法。另外一种方式是创建静态工厂方法,这里的工厂并不是设计模式中的工厂。之前有个同事喜欢使用静态工厂方法来创建类(Luzihao5),具体看到他的代码就可以知道。

1
2
3
4
// 书中的样例使用了基本类型转换包装类的例子
public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

下面列举一下静态工厂方法获取类实例的优点和缺点:

  • advantages:
    • 自定义方法名称:构造方法只能是类名称,而静态工厂方法可以取具体含义的名称。这点确实,如果有多个构造函数的话,往往需要去找到底使用哪个构造函数来创建实例。
    • 不需要每次都创建一个新的对象:如上面的例子,每次只需要返回定义好的常量即可。
    • 静态方法返回的类型可以是定义返回类型的子类

Item 6: Avoid creating unnecessary objects

如题名,避免创建不必要的对象。

  1. 以String作为例子:
1
2
String s = new String("bikini");    // 创建一个新的实例
String s = "bikini";    // 从String池创建 以后无论创建多少个 bikini 都会指向第一次创建的地址
  1. 以正则表达式的匹配为例:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// Performance can be greatly inproved
static boolean isRomanNumberal(String s) {
    return s.matches("^(?=.)")
}

// Reusing expensive object for improved performence
public class RomanNumberals {
    private static final Pattern ROMAN = Pattern.compile("^(?=.)");
    static boolean isRomanNumeral(String s) {
        return ROMAN.matchers(s).matches();
    }
}
  1. 使用基础类型而不是包装类