Effective Java:静态工厂方法的优势与应用

需积分: 18 6 下载量 86 浏览量 更新于2024-08-31 收藏 88KB DOCX 举报
"Effective Java读书笔记,记录了作者认为重要的编程实践和建议,特别是关于对象创建和销毁的部分。" 在《Effective Java》这本书中,作者深入探讨了如何编写更高效、更具可维护性的Java代码。第二章主要关注创建和销毁对象的最佳实践。第一条建议是使用静态工厂方法代替构造器。这是因为静态工厂方法有以下优点: 1. **命名**:与构造器不同,静态工厂方法可以根据返回的对象类型或其功能命名,使代码更易于理解和使用。 2. **非创建性调用**:它们并不总是创建新对象,可以重用已创建的对象,从而提高效率,特别是在对象创建成本较高的情况下。 3. **子类型返回**:静态工厂方法可以返回其声明返回类型的任何子类型,提供了更大的灵活性,尤其是在多态上下文中。 4. **动态类型**:根据传入参数,返回对象的类可以在每次调用时改变,允许实现更复杂的逻辑。 5. **延迟初始化**:静态工厂方法可以用于延迟对象的创建,直到真正需要时,这在某些情况下非常有用。 然而,静态工厂方法也有其缺点: 1. **不可子类化**:如果一个类仅包含私有构造器且提供静态工厂方法,那么这个类不能被子类化,这可能限制了设计的扩展性。 2. **不显式**:静态工厂方法不像构造器那样显而易见,程序员可能会忽视它们的存在。 书中还提到了服务提供者框架(Service Provider Framework)的概念,例如JDBC,它允许多个服务提供者实现同一服务,而客户端可以通过标准API来获取服务实例。在这个框架中: - **服务接口**:定义了提供者必须遵循的规范,如JDBC中的`Connection`接口。 - **提供者注册API**:允许服务提供者向系统注册自己的实现,如`DriverManager.registerDriver`。 - **服务访问API**:客户端通过这些API获取服务实例,如`DriverManager.getConnection`。 - **服务提供者接口**:是创建服务接口实例的工厂对象,例如JDBC的`Driver`接口。 服务访问API有时会返回比提供者本身实现更丰富功能的服务接口,这种设计模式被称为桥接模式,增加了系统的灵活性和可扩展性。 书中还列举了一些静态工厂方法的惯用名称,如`from`, `of`, `valueOf`, `getInstance`, `create`, `newInstance`, `getType`, `newType`, 和 `type`等,这些命名约定可以帮助开发者识别和使用静态工厂方法。 理解并适当地应用静态工厂方法是提升Java代码质量的关键之一,它们能够提供更好的控制力和灵活性,同时在某些情况下可以优化性能。然而,也要注意它们带来的潜在问题,比如限制了类的可扩展性。