Avevo un caso simile e mi sono reso conto cheEach non mi avrebbe aiutato nel modo in cui l'ho usato.
così ho pensato chiusure sono una soluzione:
@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);
}
}
Ma l'afferma fallisce in quanto l'oggetto della collezione non è stata modificata. Forse sto facendo qualcosa di sbagliato lì.
Alla fine ho usato chiusure dalla collezione di apache commons.
UPDATE
sono stato in grado di risolvere il puzzle con una chiusura. Sembra che tu non possa usare la variabile gratuita diretta. Ecco il codice di lavoro:
@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);
}
Nota: invece di this
si può anche scrivere una classe che contiene il metodo visit
e utilizzarlo nella definizione del closure
.
I anche la raccolta di beni usati. –
Mi sono imbattuto in un frammento, il che mi ha fatto guardare ancora il problema ... questa volta sono stato in grado di cambiare il valore della variabile libera ;-) – Spindizzy