Ich denke, dass für die Erfassung von Lambdas, muss ein Objekt zugewiesen werden (sei es Object[]
oder einige abc$Lambda$xyz
Typ). Ist es möglich, diesen Prozess irgendwie anzupassen? Sagen wir, ich diesen Code haben:Pool Capturing Lambdas
private void test() {
int x = 5;
Supplier<Integer> supplier =() -> x;
foo(supplier); // potentially passes the supplier to another thread etc.
}
und ich will nicht das Objekt zuweisen x
erfassen, sondern nur aus einem Pool bekommen und im Wert füllen; Ich weiß auch, dass ich irgendwann das Objekt in den Pool zurückbringen kann.
kann ich
Supplier<Integer> supplier = pool.get(x, v -> v);
schreiben, und ich spezialisierte Versionen für unterschiedliche Argumenttypen (wie mit Object...
die Zuteilung (ok, es gibt eine Chance haben könnte, dass die Zuteilung von Flucht beseitigt würde Analyse tun würde ...), aber das würde den Code ganz unlesbar machen. Deshalb für einen Aspekt artig ich bin auf der Suche.
Ist so etwas möglich?
EDIT: den Pool der Funktionalität deutlicher zu machen, werden die get
könnte als
class IntHolderSupplier implements Supplier<Integer> {
int value;
IntFunction<Integer> func;
@Override public Integer get() {
return func.apply(value);
}
}
class Pool {
Supplier<Integer> get(int arg, IntFunction<Integer> func) {
IntHolderSupplier holder = ...;
holder.value = arg;
holder.func = func;
return holder;
}
}
umgesetzt und ich würde für alle möglichen Arten solcher Halter mit spezifischen Signaturen müssen lambdas ich verwenden möchte.
Vielleicht habe ich das Beispiel ein bisschen kompliziert, indem ich die Funktion zur Verfügung stellte - aber ich wollte die Tatsache erfassen, dass eine zusätzliche Berechnung auf das erfasste Argument zum Zeitpunkt Supplier.get()
Invocation angewendet werden kann.
Und ignorieren Sie die Tatsache, dass die int eingerahmt wird, die eine Zuordnung produzieren.
Meinst du etwas wie 'supplier =() -> pool.getInteger();'? – bradimus
@bradimus Sorry, ich verstehe die Frage nicht. Die Absicht besteht darin, ein gepooltes Objekt zu erhalten, das bei seiner Geschäftslogik den Wert 5 zurückgibt. Der Pool kann diese Geschäftslogik nicht kennen. –
Diese Halterimplementierungen sollten Ihnen helfen, die Erstellung von Objekten zu verhindern, wenn Function auch nicht erfasst wird. Ich bin sehr gespannt, wo Sie diesen Teil optimieren müssen, könnten Sie bitte den Kontext angeben, in dem er verwendet wird? –