static内部类本身不是工厂方法,但能以轻量、解耦、可读性强的方式承载工厂逻辑,是实现优雅工厂模式的常用技巧;它不持有外部类实例引用,可访问外部类静态成员,支持私有构造+静态工厂方法,天然适配构建职责。
Java 中 static 内部类本身不是工厂方法,但它能以轻量、解耦、可读性强的方式承载工厂逻辑,是实现优雅工厂模式的常用技巧。
static 内部类不持有外部类实例引用,无内存泄漏风险,适合封装独立的构建逻辑。它可访问外部类的静态成员(包括私有静态字段/方法),又能被单独实例化或调用,正好契合“创建对象”这一单一职责。
Outer.Builder.build() 或 Outer.Factory.create(...)
Builder 是工厂方法的常见变体,static 内部类是其自然载体。外部类定义不可变结构,内部类负责逐步组装并最终构造实例。
public class Order { private final String id; private final BigDecimal amount; private final List<Item> items; private Order(Builder builder) { this.id = builder.id; this.amount = builder.amount; this.items = Collections.unmodifiableList(builder.items); } public static class Builder { private String id; private BigDecimal amount; private final List<Item> items = new ArrayList<>(); public Builder id(String id) { this.id = id; return this; } public Builder amount(BigDecimal amount) { this.amount = amount; return this; } public Builder addItem(Item item) { items.add(item); return this; } public Order build() { // 校验逻辑可放在这里 if (id == null || amount == null) throw new IllegalStateException("id and amount required"); return new Order(this); } }}
调用时干净直观:Order order = new Order.Builder().id("123").amount(new BigDecimal("99.99")).addItem(item).build();
立即学习“Java免费学习笔记(深入)”;
当创建逻辑较复杂(如需策略选择、配置加载、依赖注入准备),比单个静态工厂方法更易维护和测试。
JsonFactory.fromFile(...)、JsonFactory.fromString(...)
示例:
public class JsonData { private final String content; private JsonData(String content) { this.content = content; } public static class Factory { private static final ObjectMapper mapper = new ObjectMapper(); public static JsonData fromString(String json) { // 可加 trim、非空校验、格式预检 if (json == null || json.trim().isEmpty()) throw new IllegalArgumentException("JSON string cannot be blank"); return new JsonData(json.trim()); } public static JsonData fromFile(Path path) throws IOException { String json = Files.readString(path, StandardCharsets.UTF_8); return fromString(json); } }}
并非所有工厂都适合 static 内部类。以下情况建议改用独立类或依赖注入:
此时更适合定义接口 + 实现类 + DI 注入,而非静态嵌套。