进行不同父字段初始化的最佳方法是什么?
What's the best way to have different parent field initialization?
我有一个class如下
public abstract class MyObjectManager {
private final Map<MyKey, MyObject> objects;
private final MySystem system;
MyObjectManager(MySystem inputSystem) {
system = inputSystem;
// also initialize the "objects" field.
}
public void write(MyKey myKey, MyObject myObject) {...}
public MyObject read(MyKey myKey) {...}
public abstract MyObject getNewestObject();
}
我需要两种具有不同地图实现的 ConcreteManagers,例如,
一个使用new LinkedHashMap(CAPACITY_1, LOAD_FACTOR_1, true){ // override the removeEldestEntry(){// logic 1}}
。
另一个使用new LinkedHashMap(CAPACITY_2, LOAD_FACTOR_2, false){ // override the removeEldestEntry(){// logic 2}}
。
我不想将地图作为@param 传递,因为每个 ConcreteManager 的地图实现都是固定的。
我应该使用策略模式还是工厂模式来进行不同的地图初始化?
或者我应该将 objects
字段移动到每个实现 classes 吗?但是他们对read and write
方法的实现重复了很多。
如果我理解你的问题,在我看来你可以将地图作为参数添加到抽象 class,然后在子构造函数中传递具体的地图实例。例如:
public abstract class MyObjectManager {
private final Map<MyKey, MyObject> objects;
private final MySystem system;
MyObjectManager(final Map<MyKey, MyObject> objects, MySystem inputSystem) {
this.objects = objects;
this.system = inputSystem;
}
}
public class ConcreteManager extends MyObjectManager {
public ConcreteManager(MySystem inputSystem) {
super(new LinkedHashMap(CAPACITY_1, LOAD_FACTOR_1, true), inputSystem);
}
}
这种方式满足您的限制条件:
- Map class 固定为具体的管理器实现
- 对象属性保留在父对象中class
我有一个class如下
public abstract class MyObjectManager {
private final Map<MyKey, MyObject> objects;
private final MySystem system;
MyObjectManager(MySystem inputSystem) {
system = inputSystem;
// also initialize the "objects" field.
}
public void write(MyKey myKey, MyObject myObject) {...}
public MyObject read(MyKey myKey) {...}
public abstract MyObject getNewestObject();
}
我需要两种具有不同地图实现的 ConcreteManagers,例如,
一个使用new LinkedHashMap(CAPACITY_1, LOAD_FACTOR_1, true){ // override the removeEldestEntry(){// logic 1}}
。
另一个使用new LinkedHashMap(CAPACITY_2, LOAD_FACTOR_2, false){ // override the removeEldestEntry(){// logic 2}}
。
我不想将地图作为@param 传递,因为每个 ConcreteManager 的地图实现都是固定的。
我应该使用策略模式还是工厂模式来进行不同的地图初始化?
或者我应该将 objects
字段移动到每个实现 classes 吗?但是他们对read and write
方法的实现重复了很多。
如果我理解你的问题,在我看来你可以将地图作为参数添加到抽象 class,然后在子构造函数中传递具体的地图实例。例如:
public abstract class MyObjectManager {
private final Map<MyKey, MyObject> objects;
private final MySystem system;
MyObjectManager(final Map<MyKey, MyObject> objects, MySystem inputSystem) {
this.objects = objects;
this.system = inputSystem;
}
}
public class ConcreteManager extends MyObjectManager {
public ConcreteManager(MySystem inputSystem) {
super(new LinkedHashMap(CAPACITY_1, LOAD_FACTOR_1, true), inputSystem);
}
}
这种方式满足您的限制条件:
- Map class 固定为具体的管理器实现
- 对象属性保留在父对象中class