Ответ 1
Запоминание также легко с простой простой Java-формой.
Вы можете сделать это с нуля со следующими классами повторного использования.
Я использую их как кеши, чей срок службы является запросом на webapp.
Конечно, используйте Guava MapMaker
, если вам нужна стратегия выселения или другие функции, такие как синхронизация.
Если вам нужно memoize метод со многими параметрами, просто поместите параметры в список с помощью обоих методов и передайте этот список как единственный параметр.
abstract public class Memoize0<V> {
//the memory
private V value;
public V get() {
if (value == null) {
value = calc();
}
return value;
}
/**
* will implement the calculation that
* is to be remembered thanks to this class
*/
public abstract V calc();
}
abstract public class Memoize1<P, V> {
//The memory, it maps one calculation parameter to one calculation result
private Map<P, V> values = new HashMap<P, V>();
public V get(P p) {
if (!values.containsKey(p)) {
values.put(p, calc(p));
}
return values.get(p);
}
/**
* Will implement the calculations that are
* to be remembered thanks to this class
* (one calculation per distinct parameter)
*/
public abstract V calc(P p);
}
И это используется как
Memoize0<String> configProvider = new Memoize0<String>() {
@Override
public String calc() {
return fetchConfigFromVerySlowDatabase();
}
};
final String config = configProvider.get();
Memoize1<Long, String> usernameProvider = new Memoize1<Long, String>() {
@Override
public String calc(Long id) {
return fetchUsernameFromVerySlowDatabase(id);
}
};
final String username = usernameProvider.get(123L);