Java Static окончательные альтернативы для использования с Spring DI - PullRequest
0 голосов
/ 01 марта 2012

У меня есть класс, который я хотел бы иметь static final переменных.

public static final Map<String, Long> ID_MAP; 

Я хотел иметь возможность вставлять карту через Spring.Это не может быть сделано, потому что это static final.Моя альтернатива состояла в том, чтобы объявить его как static и использовать Spring с установщиком.Что-то вроде

public void setIDMapSpring (long iDMapSpring){
   ID_MAP = iDMapSpring; 

Это, однако, означает, что другой класс может прийти изменить значение.Есть ли альтернативы, которые я могу попробовать.Я думал о том, чтобы использовать Singleton с картой в качестве поля final, но мне все еще нужно выяснить, как передать карту и, возможно, другие переменные, которые я хочу пометить final, в метод getInstance.Кроме того, я изо всех сил пытаюсь найти самое простое и наименее сложное решение.

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Сделайте карту полем и добавьте синглтон.

0 голосов
/ 01 марта 2012

Если вы обеспокоены тем, что внешний класс изменяет значение после того, как Spring установит его, вы можете интегрировать флаг в свой класс, который позволяет поле устанавливать только один раз. Скажем, вы инициализируете статическое значение AtomicBoolean с именем «CAN_SET_ID_MAP» равным true. Затем в установщике карты:

if (CAN_SET_ID_MAP.compareAndSet (true, false)) {
  ID_MAP = iDMapSpring;
} else {
  throw new IllegalStateException ("ID_MAP already set");
}

Есть и другие способы сделать это. Вы, вероятно, хотите использовать поточно-ориентированную форму защиты независимо от этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...