Wiem o tym jednym http://onjava.com/pub/a/onjava/2003/08/20/memoization.html, ale czy jest coś jeszcze?Jakie są różne techniki zapamiętywania w Javie?
Odpowiedz
memoization jest łatwe zwykły prosty typesafe Java.
Możesz zrobić to od podstaw, używając następujących klas wielokrotnego użytku.
Używam ich jako pamięci podręcznych, których długość życia jest wymagana na stronie internetowej.
Oczywiście użyj Guava MapMaker
, jeśli potrzebujesz strategii eksmisji lub więcej funkcji, takich jak synchronizacja.
Jeśli chcesz zapamiętać metodę z wieloma parametrami, po prostu umieść parametry na liście za pomocą obu technik i przekaż tę listę jako pojedynczy parametr.
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);
}
I to służy jak ten
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);
Guava nie jest jeszcze zatwierdzona dla naszego środowiska, oprogramowania finansowego ... – ranv01
Guava nie jest jeszcze zatwierdzona dla naszego środowiska. Oprogramowanie bankowe ... Ale to wystarczy. Ograniczę jednak rozmiar mapy, aby uniknąć wycieków pamięci. Nie dbam o eksmisje, ponieważ będzie to zachowane tylko podczas inwokacji jednej metody. – ranv01
Podobał mi się sposób, w jaki wysoko przetestowany kod nie został zatwierdzony, ale coś wklejone na SO to: :) –
przykład:
import java.math.BigInteger;
import com.google.common.base.Preconditions;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public class Fibonacci {
private static final LoadingCache<Integer, BigInteger> CACHE
= CacheBuilder.newBuilder().build(CacheLoader.from(Fibonacci::fib));
public static BigInteger fib(int n) {
Preconditions.checkArgument(n >= 0);
switch (n) {
case 0:
return BigInteger.ZERO;
case 1:
return BigInteger.ONE;
default:
return CACHE.getUnchecked(n - 1).add(CACHE.getUnchecked(n - 2));
}
}
}
MapMaker jest teraz przestarzały na rzecz CacheBuilder: https://code.google.com/p/guava-libraries/wiki/MapMakerMigration – dzieciou
@dzieciou W końcu zaktualizowałem kod do czegoś, co działa z najnowszym Guava (18.0 na obecny czas pisania). I tym razem jest testowany! –
Aby memoize funkcji bez parametrów użyć Guava na Suppliers.memoize(Supplier)
. W przypadku funkcji z parametrami należy użyć CacheBuilder.build(CacheLoader)
z obiektami wartości parametrów jako kluczami.
- 1. Jakie są różne rodzaje runfiles
- 2. Jakie są różne rodzaje spraw?
- 3. Jakie są różne sposoby, w jakie "to" może uciec w Javie?
- 4. Jakie są różne sposoby zastąpienia kursora?
- 5. Jakie są techniki obchodzenia reguł bezpieczeństwa pobierania plików IE?
- 6. Jakie techniki są używane do debugowania złożonych wiązań guice?
- 7. Jakie są akceptowane techniki pozostawania zalogowanym na stronie internetowej?
- 8. Potrzebuję uczyć się usług sieciowych w Javie. Jakie są w nim różne typy?
- 9. Django - Czy metody zapamiętywania modelu są leniwe?
- 10. Jakie operacje w Javie są uważane za atomowe?
- 11. Jakie są odpowiednie i nieodpowiednie zastosowania refleksji w Javie?
- 12. Jakie są różne sposoby obsługi wyliczeń na serwerze SQL?
- 13. Jakie są różne przypadki użycia joblib a pickle?
- 14. Jakie są różne wtyczki do debugowania Rubiego dla VIM?
- 15. Jakie techniki/narzędzia są dostępne do odkrywania popularnych zwrotów w kawałkach tekstu?
- 16. Jakie są niektóre techniki i narzędzia do profilowania nadmiernego rozmiaru kodu w aplikacjach C/C++?
- 17. Jakie są dobre techniki radzenia sobie ze zmianami stanu i stanu w tworzeniu gier?
- 18. Co to są egzotyczne techniki analizowania?
- 19. Techniki dziedziczenia bazy danych?
- 20. Techniki optymalizacji kodu w extjs?
- 21. Jakie są strategie scalania git?
- 22. Jakie narzędzia lub techniki są dostępne do "dataminowania" mojego repozytorium mercurialnego?
- 23. Jakie techniki są używane przez programistów do pisania możliwych do utrzymania testów integracji/funkcjonalności/akceptacji?
- 24. Jakie są skuteczne techniki łączenia ochrony CSRF z interfejsami API RESTful?
- 25. Jakie są standardowe techniki usuwania segmentacji (np. Ludzi lub ptaków) z wideo?
- 26. Jakie są techniki pozwalające uniknąć zatwierdzania skryptów za pomocą skryptu Groovy przepływu pracy Jenkins?
- 27. Czy zbyt duże powiązanie danych powoduje spowolnienie działania aplikacji WPF? Jakie są dostępne techniki optymalizacji?
- 28. Techniki Oracle debugowania
- 29. Tablice są reifikowane w Javie
- 30. Jakie techniki przyczyniły się do poprawy wydajności Haskell?
W tym przykładzie następuje zapamiętanie wszystkich metod obiektu za pośrednictwem serwera proxy. Ale typowa notyfikacja to jedna funkcja w tym czasie. Ta technika proxy byłaby denerwująca, gdybyś nie chciał zapamiętać wszystkich metod obiektu. – lacroix1547