深入理解 Java 泛型工厂方法:类型安全与灵活性的结合
泛型工厂方法是指使用泛型参数来创建对象的静态方法。它可以返回与传入类型参数一致的实例,从而确保类型安全并提高代码的灵活性和重用性。
1. 基本实现
泛型工厂方法通常接受一个 Class 对象作为参数,并返回该类的实例。以下是一个基本的实现示例:
public class Factory { public static <T> T createInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException { return clazz.newInstance(); } }
在这个例子中,createInstance 方法是一个泛型方法,接受一个 Class 类型的参数,并返回一个类型为 T 的实例。该方法使用 clazz.newInstance() 来创建实例,这种方式要求 T 必须有一个无参构造函数。
2. 使用示例
假设有一个简单的类 Product,可以通过泛型工厂方法来创建它的实例:
public class Product { private String name; public Product() { this.name = "Default Product"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
使用泛型工厂方法来创建 Product 的实例:
public class Main { public static void main(String[] args) { try { Product product = Factory.createInstance(Product.class); System.out.println(product.getName()); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } } }
输出结果:
Default Product
3. 改进实现
Java 8 引入了 Supplier 接口,可以用来简化泛型工厂方法的实现,避免使用反射创建实例。下面是一个改进的示例:
import java.util.function.Supplier; public class Factory { public static <T> T createInstance(Supplier<T> supplier) { return supplier.get(); } }
使用 Supplier 的实现:
public class Product { private String name; public Product() { this.name = "Default Product"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class Main { public static void main(String[] args) { Product product = Factory.createInstance(Product::new); System.out.println(product.getName()); } }
4. 创建具有参数化构造函数的实例
通过 Supplier 接口的方法无法直接创建具有参数化构造函数的实例。在这种情况下,可以使用 Function 接口:
import java.util.function.Function; public class Factory { public static <T, R> T createInstance(Function<R, T> function, R arg) { return function.apply(arg); } }
示例类:
public class Product { private String name; public Product(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
使用 Function 来创建具有参数化构造函数的实例:
public class Main { public static void main(String[] args) { Product product = Factory.createInstance(Product::new, "Custom Product"); System.out.println(product.getName()); } }
输出结果:
Custom Product
5. 总结
泛型工厂方法通过使用泛型参数和反射或函数式接口,能够动态地创建类型安全的对象实例。它可以显著提高代码的灵活性和可重用性,避免硬编码特定类型的创建逻辑。掌握泛型工厂方法的使用,对于编写高效、灵活且可维护的 Java 代码具有重要意义。