Статическая переменная в абстрактном обобщенном классе - PullRequest
2 голосов
/ 20 ноября 2011

У меня есть класс с именем cache. Это универсальный абстрактный класс, отвечающий за обработку глобального кэша для типа forever. Мой вопрос: если у меня есть статическая переменная в базовом классе, будет ли статическая переменная уникальной для каждого расширяющего типа или она будет одинаковой для всех типов, расширяющих Cache.

Например, интерфейс:

Cache<K, V> 
  private static Cache<K, V>
  [creates a cache store on first load]
  static V get(K key);

Тогда у меня есть класс реализации:

PersonCache extends Cache<String, Person>
   void load(String person);

JobCache extends Cache<Integer, Job>
   void load(Integer key);

Какое поведение будет ожидать от статической переменной Cache. [Намерение переменной get состоит в том, чтобы быть единственной общедоступной точкой входа в хранилище JobCache / PersonCache] будет ли каждый тип (PersonCache, JobCache] иметь свое собственное хранилище кэша, или Cache попытается сохранить все, что получит?

Ответы [ 2 ]

3 голосов
/ 20 ноября 2011

Не думаю, что ты можешь это сделать.Из спецификации языка Java Sec.8.1.2 :

Ошибка времени компиляции - ссылка на параметр типа класса C в любом месте объявления статического члена C или объявления статического членалюбого объявления типа, вложенного в C. Это ошибка времени компиляции для ссылки на параметр типа класса C внутри статического инициализатора C или любого класса, вложенного в C.

2 голосов
/ 20 ноября 2011

Переменная private static Cache будет сохранена один раз против класса Cache и ни одного из подклассов.

Функция вашего [creates a cache store on first load] должна решить, какой подкласс создать. Этот метод будет статическим, поэтому его нельзя переопределить.

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

...