Ich kenne dieses http://onjava.com/pub/a/onjava/2003/08/20/memoization.html aber gibt es noch etwas?Was sind die verschiedenen Techniken für Memoization in Java?
Antwort
memoization ist auch einfach, mit einfachen einfachen typsichere Java.
Sie können es mit den folgenden wiederverwendbaren Klassen von Grund auf neu erstellen.
Ich verwende diese als Caches, deren Lebensdauer die Anfrage auf einer Webapp sind.
Natürlich verwenden Sie die Guava MapMaker
, wenn Sie eine Räumungsstrategie oder mehr Funktionen wie Synchronisation benötigen.
Wenn Sie eine Methode mit vielen Parametern memoisieren müssen, fügen Sie die Parameter in eine Liste mit beiden Techniken ein und übergeben diese Liste als einzigen Parameter.
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);
}
Und das verwendet wird, wie diese
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 ist noch nicht für unsere Umwelt zugelassen, finanzielle Software ... – ranv01
Guava ist noch nicht für unsere Umwelt zugelassen. Banking-Software ... Aber das wird es tun. Ich werde die Größe der Karte jedoch begrenzen, um Speicherlecks zu vermeiden. Mir sind Räumungen egal, da dies nur während des Aufrufs einer Methode erhalten bleibt. – ranv01
Ich mag die Art, wie hoch getesteter Code nicht genehmigt ist, aber etwas auf SO eingefügt ist :) –
Ja. Verwenden Sie caches von Guava.
Beispiel:
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 ist jetzt zugunsten von CacheBuilder veraltet: https://code.google.com/p/guava-libraries/wiki/MapMakerMigration – dzieciou
@dzieciou Ich habe den Code endlich auf etwas aktualisiert, das mit der neuesten Guava funktioniert (18.0 at aktuelle Schreibzeit). Und dieses Mal ist es getestet! –
Um Funktionen ohne Parameter memoize verwenden Guava des Suppliers.memoize(Supplier)
. Verwenden Sie für Funktionen mit Parametern CacheBuilder.build(CacheLoader)
mit Parameterwertobjekten als Schlüssel.
- 1. Was sind die verschiedenen Techniken sind megamorphic Aufrufstellen effizienter
- 2. Was sind die C++ Compiler-Optimierung Techniken in Visual Studio
- 3. Was sind die verschiedenen Zieltypen in EDE?
- 4. Was sind die verschiedenen Auslöser in WPF?
- 5. Was sind die verschiedenen Eigenschaften in System.DirectoryServices.DirectorySearcher.PropertiesToLoad
- 6. Was sind die Techniken, um Visual Web Scraper zu implementieren?
- 7. Was sind die verschiedenen AccuRev-Versionsnummern?
- 8. Was sind die Vorteile der verschiedenen Endianess?
- 9. Was sind deine Lieblings-Skelettdateien für die verschiedenen Sprachen?
- 10. iPhone: Welche sind die nützlichsten Techniken für schnellere Bluetooth?
- 11. Java-Techniken für die End-of-Lebensdauer von Objekten
- 12. Was sind die Maven-Abhängigkeitsparameter für die Java-Gradle-API?
- 13. Was sind Techniken und Verfahren zur Messung der Datenqualität?
- 14. was sind die Verwendungen der verschiedenen Join-Operationen in SQL
- 15. General Memoization in Schema
- 16. Was sind die verschiedenen ZLIB-Komprimierungsmethoden und wie erzwinge ich den Standard in Java Deflater?
- 17. Was sind die Vorteile von Java?
- 18. Memoization Handler
- 19. Funktionale Sprachen & Unterstützung für Memoization
- 20. Einfaches Beispiel für Erlang memoization
- 21. Parsing-Techniken für die Laufzeit Sprachumstellung
- 22. Was sind die möglichen Ansätze für Common-Lisp/Java-Interoperabilität?
- 23. Was sind die bevorzugten Konventionen für die Benennung von Attributen, Methoden und Klassen in verschiedenen Sprachen?
- 24. Was sind gute Muster/Techniken, um Ausführlichkeit von Java zu reduzieren
- 25. Was sind derzeit die besten Bildverarbeitungsbibliotheken für Java?
- 26. MSMQ .mp-Dateien - Was sind die verschiedenen Typen?
- 27. Was sind die verschiedenen Methoden, um bereichsübergreifende Anliegen zu injizieren?
- 28. Usability-Techniken für bessere Formularpräsentation
- 29. Was sind die verschiedenen Anwendungsfälle von Joblib gegen Gurke?
- 30. Was bedeuten die verschiedenen Klammern in Ruby?
In diesem Beispiel werden alle Methoden eines Objekts über einen Proxy protokolliert. Aber typische Memoization ist eine Funktion zu der Zeit. Diese Proxy-Technik wäre ärgerlich, wenn Sie nicht alle Methoden eines Objekts memotisieren möchten. – lacroix1547