Какой самый лучший подход? - PullRequest
       7

Какой самый лучший подход?

0 голосов
/ 11 сентября 2009

У меня вопрос по распоркам.

У меня есть HashMap, в котором почти 50 записей. Теперь я должен определить эту карту внутри класса действий, скажем TestAction. Как вы знаете, этот класс действий расширяет класс Action. Теперь мои сомнения фундаментальны: я должен загрузить карту как статическую? Каковы преимущества загрузки этой статической карты? Если я собираюсь вызвать этот класс Action 100 раз, будет ли эта карта загружена только один раз?

Кроме того, не каждый раз при вызове класса действий я могу получить доступ к этой карте. Если я вызову этот класс действий 100 раз, только 40 раз может возникнуть необходимость доступа к этой карте.

Если я загружу эту карту как

public Map getMap()
{
 Map testMap= new HashMap();
 testMap.put("Harish",25);
 testMap.put("Ravi",55);
 return testMap();
}

в чем недостаток? Какой подход лучше?

Ответы [ 3 ]

2 голосов
/ 11 сентября 2009

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

      private static final Map testMap = new HashMap();
      static {
        testMap.put("Harish",25);
        testMap.put("Ravi",55);
      }

Если вам иногда нужно изменить его, другие факторы, такие как тестирование и многопоточность, могут привести к тому, что другие параметры будут предпочтительнее.

1 голос
/ 11 сентября 2009

То, как вы его сейчас запрограммировали - testMap будет создаваться заново при каждом вызове метода getMap (). Я не уверен, что вы подразумеваете под "если вызывается класс действия" - если в вашем классе вызывается метод getMap (), тогда да - если вызывается какой-то другой метод, который каким-то образом не вызывает getMap () , тогда нет.

Должен ли я загрузить карту как статическую? Каковы преимущества загрузки этой статической карты? Если я собираюсь вызвать этот класс Action 100 раз, эта карта была бы загружена только один раз?

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

Также не каждый раз при вызове класса действий я могу получить доступ к этой карте. Если я вызываю этот класс действий 100 раз, то только 40 раз может возникнуть необходимость доступа к этой карте.

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

Я должен определить эту карту внутри класса действий

Я думаю, что это скорее предположение, а не требование - поскольку это веб-приложение, лучшим решением может быть включение карты в область приложения при запуске - почти как статическое, только оно не привязано к классу .

Вы можете добавить ServletContextListener для прослушивания запуска и остановки вашего веб-приложения, а также добавить область Map to Application, вызвав

servletContext.setAttribute("mapKey", testMap)  

Тогда в вашем действии (или в любом другом месте вашего веб-приложения) вы можете позвонить

servletContent.getAttribute("mapKey")

и получите доступ к своей карте.

0 голосов
/ 11 сентября 2009

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

...