2011-02-07 1 views
1

Так что да, я просто пытаюсь понять, есть ли более элегантный способ сделать то, что я собираюсь сделать ниже (помните, что я хотите POJO (простые Java-объекты Java), так как эта проблема связана с J2ME, поэтому никаких дженериков и современных структур данных не обнаружено в Java 1.5 и выше):Java pojo - утилизация кэшированных значений Hashtable после итерации через новый сбор данных

Предположим, у меня есть объект MyImage, который просто простой объект bean, который заполняется данными из сетевого вызова на мой сервер. Все это содержит метаданные об этом изображении, связанные с моим приложением, что более важно, оно содержит уникальный идентификатор, который используется для создания URL-адреса, чтобы получить изображение с моего сервера для этого объекта. Я получаю новый набор этих объектов так часто, когда я делаю запрос для них, некоторые из которых совпадают с предыдущими запросами.

Теперь, несмотря на то, что я могу загрузить изображение, возникает проблема кэширования данных изображения таким образом, что когда я получаю новый набор объектов MyImage, я перекрестно ссылаюсь на них на свой кеш и только сохраните изображение для этого объекта MyImage, если он уже был загружен. Другими словами, когда я сохраняю загруженное изображение в кеш-память Hashtable, я определяю данные изображения с помощью сконструированного URL-адреса (MY_IMAGE_SERVER + myImageUniqueId). Когда я получаю новый набор объектов MyImage, в настоящее время я делаю следующее:

Hashtable imgs = getImages(); 

//If we have cached images, we should see which ones to carry over. 
if(imgs.size() > 0){  
    Hashtable newImgs = new Hashtable(); 
    for(int i = 0; i < myImages.length; i++){ 
     MyImage mi = myImages[i]; 
     if(mi != null && mi.hasImage()){ 
      //Check if we have the MD5 URL 
      if(imgs.containsKey(IMG_URL_PATH + mi.getUniqueId())){ 
       //Place in new hashtable 
       newImgs.put(IMG_URL_PATH + mi.getUniqueId(), imgs.get(IMG_URL_PATH + mi.getUniqueId())); 
      } 
     } 
    } 
    _bannerImgs = newImgs; 
} 

мне интересно, если это звучит законно, или это может быть сделано в лучшем более эффективным способом?

ответ

0

Followup

на основе предполагаемой цели коды в комментарии (ниже), то, как вы делаете это, кажется разумным, но есть несколько незначительной оптимизации вы могли бы сделать. Измените соответствующую часть кода следующим образом:

// Check if we have the image in our cache 
    String key = IMG_URL_PATH + mi.getUniqueId(); 
    Object image = imgs.get(key); 
    if (image != null) { 
     // Carry over to new cache 
     newImgs.put(key, image); 
    } 

Примечание:

  1. Создание/с использованием локальной переменной позволяет избежать создания ключевой строки в 3 раза.
  2. Использование get вместо contains исключает один поиск в хэш-таблице.

Однако, сомнительно, что это будет иметь существенное значение для производительности вашей системы ... если метод getUniqueId() не делает что-то бесшабашный, как вычислить сумму MD5 каждый раз, когда вы называете его. (И, по-видимому, это не так.)

Несмотря на производительность, я бы сделал это изменение, потому что он упрощает чтение кода ... IMO.

+0

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

+0

FYI, значения для uniqueId предварительно определены и заданы в камне, все вычисления выполняются на бэкэнд для каждого возвращенного изображения. –

-1

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

imgs.keySet().retainAll(stillValidKeys); 

однако, если все у вас есть список, то ваш текущий код, вероятно, достаточно ,

+0

К сожалению, поскольку J2ME/CLDC использует голые и старые версии Java, поддержка объектов Set не поддерживается, поэтому функция не будет работать для моего случая. –