Как уже говорили другие, это невозможно ни в Java, ни в Swift.
На основании вашего комментария я придумал простой пример:
import java.util.function.Supplier;
public class Variable<T extends Number> {
private Supplier<T> value;
public Variable(final T value) {
this.value = () -> value;
}
public Variable(final Supplier<T> expression) {
this.value = expression;
}
public T value() {
return this.value.get();
}
public void update(T value) {
this.value = () -> value;
}
public void update(final Supplier<T> expression) {
this.value = expression;
}
}
Вот как выиспользуйте его:
Variable<Integer> a = new Variable<>(10);
Variable<Integer> b = new Variable<>(20);
Variable<Integer> c = new Variable<>(() -> Integer.sum(a.value(), b.value()));
System.out.println(c.value()); // 30
b.update(10);
System.out.println(c.value()); // 20
b.update(() -> Integer.sum(a.value(), 100));
System.out.println(b.value()); // 110
System.out.println(c.value()); // 120
Конечно, это даже не близко к вашему примеру, но показывает доказательство концепции с использованием классов-оболочек.
Остерегайтесь того, что эта реализация может выдать StackOverflowError
если у вас есть рекурсивные определения, например b.update(() -> Integer.sum(a.value(), c.value()));
.
Поскольку вы упомянули, что вы новичок в Java, вы можете прочитать больше о лямбда-выражениях здесь .Вы также можете прочитать о Ленивая оценка .