我有一个包含map变量的抽象类,对于扩展抽象类的子类,我想使用不同的实现初始化map。
例如:
public abstract class Abs() {
protected Map<Object, Object> map;
}
public class classA extends Abs {
public classA() {
map = new HashMap<>();
}
}
public class classB extends Abs {
public classB() {
map = new ConcurrentHashMap<>();
}
}
public class classC extends Abs {
public classC() {
map = new LinkedHashMap<>();
}
}
我的问题是:这种实现是否有当前的设计模式?另外因为在抽象类中,我们没有初始化地图,是否有任何顾虑呢?
要强制每个子类提供映射实例,您只需要它们作为构造函数参数提供它:
public abstract class Abs {
private Map<Object, Object> map;
protected Abs(Map<Object, Object> map) {
this.map = map;
//you can even validate:
if(null == this.map) throw new IllegalArgumentException("...");
}
}
public class classA extends Abs {
public classA() {
super(new HashMap<Object, Object>());
}
}
//all other subclasses follow the same logic