Skip to content

Commit 9059f4a

Browse files
committed
✨ BAEL-3237 AutoValue Builder with defensive copies
1 parent ffe5485 commit 9059f4a

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.baeldung.autovalue;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
7+
import com.google.auto.value.AutoValue;
8+
9+
@AutoValue
10+
public abstract class Person {
11+
12+
public abstract String name();
13+
14+
public abstract List<String> favoriteMovies();
15+
16+
public static Builder builder() {
17+
return new AutoValue_Person.Builder();
18+
}
19+
20+
@AutoValue.Builder
21+
public static abstract class Builder {
22+
23+
public abstract Builder name(String value);
24+
25+
public abstract Builder favoriteMovies(List<String> value);
26+
27+
abstract List<String> favoriteMovies();
28+
29+
abstract Person autoBuild();
30+
31+
public Person build() {
32+
List<String> favoriteMovies = favoriteMovies();
33+
List<String> copy = Collections.unmodifiableList(new ArrayList<>(favoriteMovies));
34+
favoriteMovies(copy);
35+
return autoBuild();
36+
}
37+
}
38+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.baeldung.autovalue;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertFalse;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
import org.junit.Test;
10+
11+
/**
12+
* Unit Test which verifies that the {@link Person} value object creates defensive copies of its favoriteMovies list.
13+
*/
14+
public class PersonUnitTest {
15+
16+
@Test
17+
public void givenNewPerson_whenModifyOriginalList_thenValueObjectIsNotAlsoModified() {
18+
// GIVEN new Person
19+
List<String> originalFavoriteMoviesList = new ArrayList<String>();
20+
originalFavoriteMoviesList.add("Training Day");
21+
originalFavoriteMoviesList.add("Fast and the Furious");
22+
Person person = Person.builder()
23+
.name("Dan")
24+
.favoriteMovies(originalFavoriteMoviesList)
25+
.build();
26+
27+
// WHEN modify original list
28+
originalFavoriteMoviesList.add("Friday");
29+
30+
// THEN Person remains unaffected
31+
assertFalse(person.favoriteMovies()
32+
.contains("Friday"));
33+
assertEquals(2, person.favoriteMovies()
34+
.size());
35+
}
36+
37+
}

0 commit comments

Comments
 (0)