跳转至

《Effective Java 3rd Edition 深度解析》

简介

《Effective Java 3rd Edition》是一本由 Joshua Bloch 编写的经典 Java 书籍,它总结了一系列能够帮助 Java 开发者编写高效、健壮且易于维护代码的最佳实践和经验法则。这本书涵盖了从基础语法到高级特性的各个方面,对于提升 Java 编程技能有着极大的帮助。

目录

  1. 基础概念
  2. 使用方法
  3. 常见实践
  4. 最佳实践
  5. 小结
  6. 参考资料

基础概念

不可变对象

不可变对象是指一旦创建,其状态就不能被修改的对象。在 Java 中,通过将类的所有字段声明为 final 并且不提供修改字段的方法来实现。

public final class ImmutablePoint {
    private final int x;
    private final int y;

    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

静态工厂方法

静态工厂方法是类中的静态方法,用于创建类的实例。与构造函数不同,它们有自己的名字,并且可以返回原返回类型的任何子类型的对象。

public class StaticFactoryExample {
    private StaticFactoryExample() {}

    public static StaticFactoryExample getInstance() {
        return new StaticFactoryExample();
    }
}

使用方法

创建对象

优先使用静态工厂方法而不是构造函数。静态工厂方法有名字,更具描述性,还可以缓存已创建的对象以提高性能。

// 使用构造函数创建对象
Date date1 = new Date();

// 使用静态工厂方法创建对象
Date date2 = Date.from(Instant.now());

泛型的使用

在使用集合类时,始终使用泛型来确保类型安全。

// 没有使用泛型,存在类型安全问题
List list = new ArrayList();
list.add("string");
// 可能会引发 ClassCastException
Integer num = (Integer) list.get(0);

// 使用泛型,确保类型安全
List<String> stringList = new ArrayList<>();
stringList.add("string");
// 编译时会检查类型
// stringList.add(1); // 编译错误

常见实践

避免不必要的对象创建

不要在循环中创建不必要的对象,尽量复用已有的对象。

// 不好的做法,每次循环都创建新的对象
for (int i = 0; i < 1000; i++) {
    String str = new String("example");
}

// 好的做法,复用同一个对象
String str = "example";
for (int i = 0; i < 1000; i++) {
    // 使用已有的对象
}

正确重写方法

当重写 equalshashCodetoString 方法时,要遵循其约定。

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return name.equals(person.name);
    }

    @Override
    public int hashCode() {
        return name.hashCode();
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

最佳实践

使用枚举代替常量

枚举类型是类型安全的,并且提供了编译时的检查。

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

使用 try-with-resources 处理资源

try-with-resources 语句可以确保资源在使用后被正确关闭,减少资源泄漏的风险。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryWithResourcesExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

小结

《Effective Java 3rd Edition》涵盖了众多提升 Java 代码质量的要点,从基础概念如不可变对象和静态工厂方法,到使用方法如创建对象和泛型的正确使用,再到常见实践和最佳实践,包括避免不必要的对象创建、正确重写方法、使用枚举和 try-with-resources 等。遵循这些原则和实践可以帮助开发者编写更高效、健壮和易于维护的 Java 代码。

参考资料

  • 《Effective Java 3rd Edition》 - Joshua Bloch
  • Oracle Java 官方文档