《Effective Java 3rd Edition 深度解析》
简介
《Effective Java 3rd Edition》是一本由 Joshua Bloch 编写的经典 Java 书籍,它总结了一系列能够帮助 Java 开发者编写高效、健壮且易于维护代码的最佳实践和经验法则。这本书涵盖了从基础语法到高级特性的各个方面,对于提升 Java 编程技能有着极大的帮助。
目录
- 基础概念
- 使用方法
- 常见实践
- 最佳实践
- 小结
- 参考资料
基础概念
不可变对象
不可变对象是指一旦创建,其状态就不能被修改的对象。在 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++) {
// 使用已有的对象
}
正确重写方法
当重写 equals
、hashCode
和 toString
方法时,要遵循其约定。
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 官方文档