✨ BAEL-3237 AutoValue Builder with defensive copies
This commit is contained in:
@@ -0,0 +1,38 @@
|
|||||||
|
package com.baeldung.autovalue;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.auto.value.AutoValue;
|
||||||
|
|
||||||
|
@AutoValue
|
||||||
|
public abstract class Person {
|
||||||
|
|
||||||
|
public abstract String name();
|
||||||
|
|
||||||
|
public abstract List<String> favoriteMovies();
|
||||||
|
|
||||||
|
public static Builder builder() {
|
||||||
|
return new AutoValue_Person.Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AutoValue.Builder
|
||||||
|
public static abstract class Builder {
|
||||||
|
|
||||||
|
public abstract Builder name(String value);
|
||||||
|
|
||||||
|
public abstract Builder favoriteMovies(List<String> value);
|
||||||
|
|
||||||
|
abstract List<String> favoriteMovies();
|
||||||
|
|
||||||
|
abstract Person autoBuild();
|
||||||
|
|
||||||
|
public Person build() {
|
||||||
|
List<String> favoriteMovies = favoriteMovies();
|
||||||
|
List<String> copy = Collections.unmodifiableList(new ArrayList<>(favoriteMovies));
|
||||||
|
favoriteMovies(copy);
|
||||||
|
return autoBuild();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package com.baeldung.autovalue;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit Test which verifies that the {@link Person} value object creates defensive copies of its favoriteMovies list.
|
||||||
|
*/
|
||||||
|
public class PersonUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNewPerson_whenModifyOriginalList_thenValueObjectIsNotAlsoModified() {
|
||||||
|
// GIVEN new Person
|
||||||
|
List<String> originalFavoriteMoviesList = new ArrayList<String>();
|
||||||
|
originalFavoriteMoviesList.add("Training Day");
|
||||||
|
originalFavoriteMoviesList.add("Fast and the Furious");
|
||||||
|
Person person = Person.builder()
|
||||||
|
.name("Dan")
|
||||||
|
.favoriteMovies(originalFavoriteMoviesList)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// WHEN modify original list
|
||||||
|
originalFavoriteMoviesList.add("Friday");
|
||||||
|
|
||||||
|
// THEN Person remains unaffected
|
||||||
|
assertFalse(person.favoriteMovies()
|
||||||
|
.contains("Friday"));
|
||||||
|
assertEquals(2, person.favoriteMovies()
|
||||||
|
.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user