Я понимаю, что для захвата лямбда должен быть выделен объект (будь то Object[]
или abc$Lambda$xyz
). Можно ли так или иначе настроить этот процесс? Скажем, у меня есть этот код:Pool capture lambdas
private void test() {
int x = 5;
Supplier<Integer> supplier =() -> x;
foo(supplier); // potentially passes the supplier to another thread etc.
}
, и я не хочу, чтобы выделить объект захвата x
, но вместо того, чтобы просто получить его из пула и заполнить значения; Я также знаю, что в какой-то момент я могу вернуть объект в пул.
Я мог бы написать
Supplier<Integer> supplier = pool.get(x, v -> v);
и я мог бы иметь специализированные версии для различных типов аргументов (как использование Object...
будет делать выделение (в порядке, есть шанс, что выделение будет устранено путем анализа побега ...), но это сделало бы код совершенно нечитаемым. Поэтому я искал более аспект, как способ.
ли такое возможно?
EDIT: сделать функциональность пула более очевидна, get
может быть реализован как
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;
}
}
и я должен был бы такой держатель с конкретными подписями для всех возможных типов лямбды я хочу использовать.
Возможно, я немного упростил пример, предоставив функцию, но я хотел бы зафиксировать тот факт, что может быть добавлено дополнительное вычисление для захваченного аргумента в момент вызова Supplier.get()
.
И, пожалуйста, проигнорируйте тот факт, что int помещается в коробку, что может привести к распределению.
Вы имеете в виду что-то вроде 'поставщик =() -> pool.getInteger();'? – bradimus
@bradimus Извините, я не понимаю вопроса. Цель состоит в том, чтобы получить объединенный объект, который по мере возврата бизнес-логики. Пул не может знать об этой бизнес-логике. –
Реализации этого держателя должны помочь вам предотвратить создание объектов, если функция также не захватывает. Мне очень любопытно, где вы должны оптимизировать эту часть, не могли бы вы дать контекст, где он будет использоваться? –