Каков наилучший способ инициализации другого родительского поля? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть класс, как показано ниже

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();
}

Мне нужны два типа ConcreteManager, которые будут иметь различную реализацию карты, например,

Один использует 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 методов во многом дублирует.

1 Ответ

0 голосов
/ 03 октября 2018

Если я понял ваш вопрос, мне кажется, что вы можете добавить карту в качестве параметра к абстрактному классу, а затем передать конкретный экземпляр карты в конструкторе дочерних элементов.Например:

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 остается в родительском.класс
...