✨ 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