只调用一次抽象类构造函数,而不是在每个特定类中

问题描述

我有这样的事情:

public abstract class Handler {

    protected ItemRepository itemRepository;

    public Handler(ItemRepository itemRepository) {
        this.itemRepository = itemRepository;
    }
}

public class SpecificHandler1 extends Handler {    

    public SpecificHandler1(ItemRepository itemRepository) {
        super(itemRepository);
    }
}

public class SpecificHandler2 extends Handler {    

    public SpecificHandler2(ItemRepository itemRepository) {
        super(itemRepository);
    }
}

我不想将 ItemRepository 作为每个特定处理程序的参数传递,因为它始终是 itemRepository 的相同实例。我只想传递 ItemRepository 一次。我不使用 Spring boot,这将使我的生活更轻松,使用 @Autowired 注释。任何想法?谢谢

解决方法

我不想将 ItemRepository 作为参数传递给每个特定的 处理程序,因为它始终是 itemRepository 的同一个实例。

虽然这不是 DRY(不要重复自己),但你做的是正确的方法。
理想情况下,应该在对象被实例化或不适合通过 setter 时设置类的依赖关系。
为了实现这一点,子类必须将 itemRepository 声明为构造函数的参数,或者最坏的情况是声明为 setter。
无论是否使用 Spring Boot,您都会遇到相同的“问题”(实际上这不是问题)。

我不推荐的一种简单的 DRY(除其他外)方法是在抽象类中“隐藏”/强耦合 itemRepository 依赖项:

public abstract class Handler {

    protected ItemRepository itemRepository;

    public Handler() {
        this.itemRepository = new ItemRepository();
    }
}

但作为副作用,您会得到一个不可单元测试的类,因为 itemRepository 不是可见的依赖项。