You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中实现两个子类共享父类同一份内存引用的方案咨询

解决Spring中子类共享父类库存实例的问题

核心思路

将共享的车辆库存封装为独立的单例Spring Bean,让抽象父类依赖这个Bean。由于Spring单例Bean在容器中仅存在一个实例,所有子类的父类部分都会引用同一个库存对象,从而实现共享访问和修改。

具体实现步骤

1. 封装库存为单例Bean

创建专门的库存持有类,负责初始化和管理车辆库存,通过Spring依赖注入获取Tesla Bean并完成库存初始化:

@Component
public class TeslaInventory {
    private List<Car> inventory;

    @Autowired
    public TeslaInventory(Tesla tesla) {
        // 仅在Bean创建时执行一次初始化
        this.inventory = tesla.getCars();
    }

    // 提供库存访问方法
    public List<Car> getInventory() {
        return inventory;
    }

    // 按需添加库存修改方法
    public void addCar(Car car) {
        inventory.add(car);
    }

    public void removeCar(Car car) {
        inventory.remove(car);
    }
}

2. 修改抽象父类

在抽象父类中注入上述库存Bean,子类可直接继承使用该引用:

public abstract class TeslaServiceCenter {
    // 注入单例库存Bean,所有子类共享同一实例
    @Autowired
    protected TeslaInventory inventoryHolder;

    // 保留抽象方法,强制子类实现业务逻辑
    public abstract void doService();
}

3. 子类实现

子类无需单独注入Tesla Bean,直接通过父类继承的inventoryHolder操作共享库存:

@Component
public class OhioServiceCenter extends TeslaServiceCenter {
    @Override
    public void doService() {
        List<Car> sharedCars = inventoryHolder.getInventory();
        // 执行俄亥俄服务中心的业务逻辑,如库存检查、车辆维修等
    }
}

@Component
public class FloridaServiceCenter extends TeslaServiceCenter {
    @Override
    public void doService() {
        List<Car> sharedCars = inventoryHolder.getInventory();
        // 执行佛罗里达服务中心的业务逻辑
    }
}

方案优势

  • 保留父类抽象性:父类仍为抽象类,可定义抽象doService方法强制子类实现业务逻辑。
  • 实现真正共享:所有子类依赖同一个TeslaInventory单例Bean,库存对象内存地址唯一,避免重复实例造成的内存浪费。
  • 符合Spring设计理念:通过依赖注入管理共享资源,规避静态变量带来的初始化顺序、测试困难等问题。

内容的提问来源于stack exchange,提问作者Vaibhav Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:43:10