Miałem podobny przypadek i zdałem sobie sprawę, że nic nie pomoże w sposób, w jaki go użyłem.
Więc pomyślałem zamknięcia są rozwiązaniem:
@Test
public void test() {
Closure modify = closure();{
of(Point.class).setLocation(var(Point.class).x+10, 10);
}
List<Point> points = new ArrayList<>();
points.add(new Point(10, 0));
points.add(new Point(10, 10));
modify.each(points);
for (Point point : points) {
assertEquals(20, point.getX(), 0.0);
}
}
Ale nie twierdzi, ponieważ obiekt w kolekcji nie zostały zmodyfikowane. Może robię coś nie tak.
W końcu użyłem zamknięć z kolekcji apache commons.
UPDATE
udało mi się rozwiązać zagadkę z zamknięciem. Wygląda na to, że nie możesz użyć bezpośredniej zmiennej bezpośredniej. Oto kod roboczych:
@Test
public void test() {
Closure modify = closure();{
of(this).visit(var(Point.class));
}
List<Point> points = new ArrayList<Point>();
points.add(new Point(10, 0));
points.add(new Point(10, 10));
modify.each(points);
for (Point point : points) {
assertEquals(20, point.getX(), 0.0);
}
}
void visit(Point p) {
p.setLocation(p.x + 10, p.y);
}
Uwaga: zamiast this
można również napisać klasy, która zawiera metodę visit
i używać go w definicji closure
.
I również zbieranie wspólnych zbiorów. –
Natknąłem się na fragment, który sprawił, że znów zacząłem analizować problem. Tym razem udało mi się zmienić wartość wolnej zmiennej ;-) – Spindizzy