具有不同父字段初始化的最佳方法是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有不同父字段初始化的最佳方法是什么?相关的知识,希望对你有一定的参考价值。

我有一个课程如下

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字段移动到每个实现类?但是他们对read and write方法的实现重复了很多。

答案

如果我理解了你的问题,在我看来你可以将地图作为抽象类的参数添加,然后在子构造函数中传递具体的地图实例。例如:

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类固定为具体的管理器实现
  • objects属性保留在父类中

以上是关于具有不同父字段初始化的最佳方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

从片段访问父活动的数据

片段之间的共享数据(父列表视图和子列表视图)

在Android中使用AES加密的最佳做法是什么?

在 SwiftUI 中装饰文本片段的最佳方法是啥?

Android中每个片段的不同操作栏 - 最佳方法?

方法签名最佳实践 - 重载与长名称