2016-08-13 8 views
2

У меня есть этот код, и я хочу понять, как он работает.RemoveEldestEntry в LinkedHashmap при попытке реализовать алгоритм LRU в java

public class LRUAlgoCacheImpl<K,V> implements IAlgoCache<K,V>{ 

    private int capacity; 

    private LinkedHashMap<K,V> lhm; 
    public LRUAlgoCacheImpl(int capacity) { 
     lhm = new LinkedHashMap<K,V>(capacity+1,1.1f, true) { 
      protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { 
       return lhm.size()> capacity; 
      } 
     };  
     this.capacity=capacity; 
    } 

Я понимаю, что она перекрывает removeEldestEntry в LinkedHashMap классе, но я не совсем понимаю, как. Я мог бы расширить LinkedHashmap в своем объявлении класса без этого и просто делать регулярное переопределение, но я пытаюсь узнать больше. Может кто-нибудь объяснить это мне, пожалуйста? Спасибо заранее.

ответ

1

Класс LRUAlgoCacheImpl реализует LRU алгоритм (наиболее давно используется) путем применения OO Разработка концепции composition с anonymous inner class, которая простирается на LinkedHashMap для того, чтобы переопределить removeEldestEntry(Map.Entry), чтобы иметь возможность выселить самую старую запись, когда размер карты превышает установленную емкость.

Зачем применять композицию над наследованием?

Основная причина связана с тем, что в Java вы можете распространять только один класс в отличие от C++, например, если вы выберете класс Inheritance, вы можете столкнуться с проблемами дизайна позже, если вам нужно будет изменить свой код. С другой стороны, Composition позволяет реализовать интерфейсы, которые являются хорошей практикой проектирования, и поскольку вы можете реализовать столько интерфейсов, сколько хотите, подход Composition гораздо более гибкий и, следовательно, лучший выбор для удобства обслуживания.

+0

Привет, спасибо за ваш комментарий. Я не понял сам синтаксис, я имею в виду, что во время объявления нового объекта открываются круглые скобки и функция переопределения? Что это значит? Спасибо заранее – Timur

+0

Это анонимный внутренний класс, проверьте ссылку в моем ответе –

+0

Большое спасибо! – Timur

Смежные вопросы