W większości przypadków funkcje konwersji są wywoływane często. Możemy to zoptymalizować dodając zapamiętywanie. Dlatego nie wykonuje obliczeń za każdym razem, gdy wywoływana jest funkcja.
Zadeklarujmy HashMap, który będzie przechowywać obliczone wartości.
private static Map<Float, Float> pxCache = new HashMap<>();
Funkcja obliczająca wartości pikseli:
public static float calculateDpToPixel(float dp, Context context) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float px = dp * (metrics.densityDpi / 160f);
return px;
}
Funkcja zapamiętywania, która zwraca wartość z HashMap i przechowuje zapis poprzednich wartości.
Memoizacja może być implementowana na różne sposoby w Javie. Dla Java 7 :
public static float convertDpToPixel(float dp, final Context context) {
Float f = pxCache.get(dp);
if (f == null) {
synchronized (pxCache) {
f = calculateDpToPixel(dp, context);
pxCache.put(dp, f);
}
}
return f;
}
Java 8 obsługuje funkcję Lambda :
public static float convertDpToPixel(float dp, final Context context) {
pxCache.computeIfAbsent(dp, y ->calculateDpToPixel(dp,context));
}
Dzięki.