/22@yegor256 1
How Much
Immutability Is
Enough
Yegor Bugayenko
/22@yegor256 2
object is a
representative
/22@yegor256 3
File f = new File(“picture.jpg”);
if (f.length() > 1000) {
f.delete();
}
/22@yegor256 4
immutability
means loyalty
/22@yegor256 5
class Book {
private int isbn;
private String title;
public setIsbn(int isbn) {
this.isbn = isbn;
}
public setTitle(String title) {
this.title = title;
}
}
/22@yegor256 6
class Book {
private final int isbn;
private final String title;
public Book(int isbn, String title) {
this.isbn = isbn;
this.title = title;
}
}
/22@yegor256 7
thread-safe
/22@yegor256 8
List<String> list = new ArrayList<>();
list.add(“x”); // thread A
list.add(“y”); // thread B
/22@yegor256 9
failure
atomicity
/22@yegor256 10
class Numbers {
private int[] array;
private int position;
void add(int x) {
this.position++;
if (x < 0) {
throw new Exception(“only positive”);
}
this.array[this.position] = x;
}
}
/22@yegor256 11
no identity
mutability
/22@yegor256 12
Map<Book, Boolean> map = new HashMap<>();
book.setId(1);
map.put(book, true);
book.setId(2);
map.put(book, true);
/22@yegor256 13
side effect free
/22@yegor256 14
void print(Book book) {
System.out.println(
“book ID is: ” + book.getId()
);
book.setId(123);
}
/22@yegor256 15
no temporal
coupling
/22@yegor256 16
request.setURI(“http://google.com”);
request.setMethod(“GET”);
request.addHeader(“Accept”, “text/html”);
String body = request.fetch();
/22@yegor256 17
trust
/22@yegor256 18
monster objects
/22@yegor256 19
reader = new Reader();
reader.setFile(“/tmp/names.csv”);
reader.setFormat(“CSV”);
reader.setColumn(3);
reader.setAllCaps(true);
reader.setCache(true);
List<String> x = reader.read();
/22@yegor256 20
object
composition
/22@yegor256 21
List<String> x = new CachedList<>(
new AllCaps( // List<String>
new OneColumn( // List<String>
new CSV( // List<List<String>>
new LinesFromStream( // List<String>
new FileInputStream(
new File(“/tmp/names.csv”)
)
)
),
3
)
)
);
/22@yegor256 22
www.yegor256.com

How Much Immutability Is Enough?