0

Создаю LRUcache

класс LRU-алгоритма:

import java.util.LinkedHashMap;
import java.util.Map;


public class LRUAlgoritm<K, V> implements Cache<K, V> {
    private final LRUStorage storage;//не хочет компилится т.к."The blank final 
                                    //field storage may not have been initialized" 
                                    // помогите как здесь правильно реализовать

    @Override
    public V get(K key) {

        return storage.get(key);
    }

    @Override
    public V put(K key, V value) {

        return storage.put(key, value);
    }

    private class LRUStorage extends LinkedHashMap<K, V> {
        private final int capacity;

        private LRUStorage(int capacity) {
            this.capacity = capacity;
        }

        protected boolean removedEldestEntry(Map.Entry<K, V> eldest) {
            return size() > capacity;
        }
    }
}

интерфейс Cache простой:

public interface Cache <K,V>{
    V get (K key);
    V put (K key, V value);
}

в классе runner

public class Runner {
    public static void main (String[] args){
        LRUAlgoritm<String, String> lruAlgoritm = new LRUAlgoritm<>();
        lruAlgoritm.put("1","1");   
    }
}

пытаюсь создать перегрузку кэша и не могу

  1. компилятор требует в классе LRUalgoritm инициализировать константу storage каким образом здесь необходимо ее инициализировать?
  2. как обратится к объекту класса LRUStorage, что бы установить у меня capacity
Sergei
  • 95

1 Answers1

1

Компилятор говорит, что надо инициализировать поле класса явным образом. Это можно сделать одним из способов:

  • в конструкторе класса
  • добавив простую инициализацию при создании объекта класса

Например:

public class LRUAlgoritm<K, V> implements Cache<K, V> {
    private final LRUStorage<K,V> storage = new LRUStorage<>(10); // Явная инициализация с установкой capacity

    // Конструтор
    public LRUAlgoritm(int capacity) {
        this.storage = new LRUStorage<>(capacity);
    }
}
Yuri H
  • 532
  • добавил `public class LRUAlgoritm<K, V> implements Cache<K, V>{ private final LRUStorage storage = new LRUStorage<>();

    public LRUAlgoritm(LRUStorage<K, V> storage) { this.storage = storage; }`

    – Sergei Jun 11 '17 at 12:44
  • @Sergei изменил ответ. Надо выбрать только один способ, оба сразу задействовать не получится. Чтобы задать capacity его надо указать при создании объекта LRUStorage – Yuri H Jun 11 '17 at 12:50
  • установка capacity происходит runner – Sergei Jun 11 '17 at 12:51
  • Вообще вам явно следует почитать о программировании в Java, в частности что такое класс и как его использовать – Yuri H Jun 11 '17 at 12:51
  • @Sergei еще раз изменил ответ – Yuri H Jun 11 '17 at 12:53
  • @ Yuri Heiko. Сейчас компилятор выбрасывает ошибку The type LRUAlgoritm<K,V>.LRUStorage is not generic; it cannot be parameterized with arguments <>. требует удалить <>. но тогда ошибка на константе storage – Sergei Jun 11 '17 at 12:54
  • Ошибка такая: The final field LRUAlgoritm<K,V>.storage cannot be assigned – Sergei Jun 11 '17 at 13:00
  • @ Yuri Heiko . посоветуйте неучу, что почитать по этой теме, что бы догнать, Инфы очень много, теряюсь. Хватаю то здесь, то там и ничего путного не получается, не складывается. Если вам не сильно трудно и не обидно отвечать на такой вопрос, пожскажите пожалуста. с уважением. Спасибо. – Sergei Jun 12 '17 at 08:57
  • @Sergei Ваш код слишком много тем затрагивает, поэтому надо читать последовательно с азов. Книги по Java и другая литература – Yuri H Jun 12 '17 at 17:14
  • @ Yuri Heiko и читаю и курсы смотрю и тесты прохожу пока конечно нечем похвастаться, поэтому и прошу помочь по данному пробелу. а если вы подскажите что можно еще по данной задаче интересное почитать буду очень признателен. – Sergei Jun 15 '17 at 08:12
  • Из русскоязычных ресурсов мне понравился этот сайт, а вообще продолжайте учить, читать и как можно больше писать код. – Yuri H Jun 16 '17 at 04:47