跳转至

《Effective Java by Joshua Bloch》技术博客

简介

《Effective Java》是由 Joshua Bloch 编写的一本关于 Java 编程语言最佳实践的经典著作。这本书涵盖了从基础概念到高级技巧的广泛内容,旨在帮助 Java 开发者写出更高效、更健壮、更易于维护的代码。通过遵循书中的准则,开发者可以避免常见的陷阱,提升代码质量,充分发挥 Java 语言的潜力。

目录

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

基础概念

不可变对象

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

public final class ImmutableExample {
    private final int value;

    public ImmutableExample(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

静态工厂方法

静态工厂方法是类中返回类实例的静态方法。与构造函数不同,它们有名称,可以返回原返回类型的任何子类型。

public class StaticFactoryExample {
    private StaticFactoryExample() {}

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

枚举类型

枚举类型是一种特殊的数据类型,它限制变量只能取特定的值。Java 中的 enum 关键字用于定义枚举类型。

public enum DayOfWeek {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

使用方法

选择合适的集合框架

根据需求选择合适的集合类型,如 ListSetMap。例如,如果需要有序存储且允许重复元素,ArrayList 是一个不错的选择。

import java.util.ArrayList;
import java.util.List;

public class CollectionUsage {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");

        for (String name : names) {
            System.out.println(name);
        }
    }
}

正确处理异常

使用 try-catch-finally 块来捕获和处理异常。确保在 finally 块中释放资源。

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class ExceptionHandling {
    public static void main(String[] args) {
        Reader reader = null;
        try {
            reader = new FileReader("example.txt");
            int data = reader.read();
            while (data != -1) {
                System.out.print((char) data);
                data = reader.read();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

常见实践

避免空指针异常

在访问对象引用之前,先进行 null 检查。

public class NullCheck {
    public static void main(String[] args) {
        String str = null;
        if (str != null) {
            System.out.println(str.length());
        }
    }
}

使用可变参数

可变参数允许方法接受可变数量的参数。

public class VarArgsExample {
    public static void printNumbers(int... numbers) {
        for (int number : numbers) {
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        printNumbers(1, 2, 3);
    }
}

最佳实践

优先使用接口而非实现

面向接口编程可以提高代码的灵活性和可维护性。

import java.util.List;
import java.util.ArrayList;

public class InterfaceUsage {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        // 这里使用 List 接口,而不是 ArrayList 实现,便于未来替换实现
    }
}

减少不必要的对象创建

避免频繁创建相同的对象,可以通过缓存或复用对象来提高性能。

import java.util.Date;

public class ObjectReuse {
    private static final Date now = new Date();

    public static Date getCurrentDate() {
        return now;
    }

    public static void main(String[] args) {
        Date date1 = getCurrentDate();
        Date date2 = getCurrentDate();
        // 复用了同一个 Date 对象
    }
}

小结

《Effective Java by Joshua Bloch》涵盖了众多重要的 Java 编程概念、使用方法、常见实践和最佳实践。通过遵循这些准则,开发者能够提升代码的质量、性能和可维护性。不可变对象、静态工厂方法、枚举类型等基础概念是编写健壮代码的基石;合理选择集合框架、正确处理异常等使用方法能确保程序的稳定性;避免空指针异常、使用可变参数等常见实践是日常编程中需要注意的细节;而优先使用接口、减少不必要的对象创建等最佳实践则有助于打造高效且可扩展的系统。

参考资料

  • 《Effective Java》 - Joshua Bloch