Java abstract class 包含一个映射变量,subclass 使用不同的实现来初始化映射
Java abstract class contains a map variable, subclass initialize the map using different implementation
我有一个包含映射变量的抽象 class,对于扩展抽象 class 的子class,我想使用不同的实现来初始化映射。
例如:
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<>();
}
}
我的问题是:是否有针对这种实现的当前设计模式?又因为在抽象class中,我们没有初始化map,有什么顾虑吗?
要强制每个子类提供一个地图实例,您可以简单地要求它们将其作为构造函数参数提供:
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
我有一个包含映射变量的抽象 class,对于扩展抽象 class 的子class,我想使用不同的实现来初始化映射。
例如:
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<>();
}
}
我的问题是:是否有针对这种实现的当前设计模式?又因为在抽象class中,我们没有初始化map,有什么顾虑吗?
要强制每个子类提供一个地图实例,您可以简单地要求它们将其作为构造函数参数提供:
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