Статический доступ к HashMap / Array? - PullRequest
0 голосов
/ 22 октября 2009

Вот пример статического метода, который используется в веб-приложении. Как вы можете видеть, String [] allergensArr сходит с ума каждый раз, когда вызывается этот метод. Он потокобезопасен, поскольку находится в статическом методе, но это дорогой вызов.

Какими еще способами можно использовать allergensArr [], чтобы он не создавался при каждом вызове метода.

Я рассматривал следующие варианты.

  • Иметь статический конструктор, который инициализирует финальную статическую строку []
  • Используйте синглтон (хотя это блокирует много людей)

Это будет постоянный массив, который не изменится за время существования экземпляра сервера.

public class UserHealthConcernsManager {
    public static String[] getAllergensFlag () {

        String[] allergensArr = new String[12];

        allergensArr[0] = "x";
        allergensArr[1] = "y";
        allergensArr[2] = "w";
                 _SNIP_
                return allergensArr;
     }
}

Ответы [ 5 ]

3 голосов
/ 22 октября 2009

Рассматривали ли вы использование List s вместо массивов ссылок?

Код может быть уменьшен до:

public static final List<String> allergensFlag =
    Collections.unmodifiableList(Arrays.asList(
        "x",
        "y",
        "w",
        ...
    ));

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

private static final String[] allergensFlag = {
    "x",
    "y",
    "w",
    ...
};

public static String[] getAllergensFlag () {
    return allergensFlag.clone();
}
2 голосов
/ 22 октября 2009
  1. Static не означает потокобезопасность. Если «пользователь» (HashMapSupport) используется несколькими потоками ...
  2. Это не выглядит ужасно дорого.
  3. Вы можете хранить такую ​​информацию в объекте Session, если вам действительно нужно.
  4. Если вам нужно гарантировать, что строковый массив не может быть изменен, то вам нужно обернуть массив строк в какой-то другой объект, чтобы гарантировать, что хранимый объект является неизменным (например, только методы получения).

Редактировать: Ярг. Как отметили другие, вы значительно изменили проблему. Если вы хотите гарантировать неизменность массива, см. Пункт № 4.

1 голос
/ 22 октября 2009

Статический конструктор кажется очевидным решением.

static String[] allergensArr = {"x", "y", "w", ...9 more...}

Вам нужно убедиться, что никто не переназначает статическое поле и не изменяет массив в течение времени жизни вашего приложения.

Обновление: если вы действительно хотите, чтобы ни один клиент не вмешался, вы можете сделать следующее:

final static List<String> x = Collections.unmodifiableList(Arrays.asList("x", "y", "z", ...));
0 голосов
/ 22 октября 2009

Просто инициализируйте массив при запуске веб-приложения и поместите в контекст сервлета. См. ServletContextListener и ServletContext .

0 голосов
/ 22 октября 2009

Иногда определенная область проблемы может быть слишком узкой, чтобы дать хорошую оптимизацию.

Если ваша проблема в том, что вам НЕОБХОДИМО переместить эти элементы из переданной в хэш-карте в массив, это не станет слишком эффективным (хотя вы, вероятно, захотите начать с массива, подобного этому: new String [] {"ADDED_SUGARS_FREE_FLAG", "EGG_FREE_FLAG", ...} и выполните итерацию по нему, чтобы у вас не было всех этих дублированных строк.

Так что, чтобы получить лучшую оптимизацию, вам может понадобиться уменьшить уровень или два. Почему вы храните их в массиве, вы не можете просто скопировать хэш-карту пользователя полностью или частично? Может ли пользовательский хэш-файл сделать неизменным, чтобы вы могли просто сделать его копию указателя и даже не потрудиться извлечь значение?

А еще лучше, можете ли вы обернуть HashMapSupport более интеллектуальной коллекцией, которая решает проблемы всех классов, использующих ее.

Я не могу ответить ни на один из этих вопросов, не зная больше о вашем коде, но я бы посмотрел на такие вещи.

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

return new String[]{"w", "x", "y", ...}

Вы уверены, что не упростили часть проблемы?

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