问题描述
我有这样的事情:
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
不是可见的依赖项。