3, false, -1, null, "X"); L .toBuilder() allows unrestricted changes var obj2 = obj1.toBuilder().a(1).b(2)...build(); J Meaningful methods, that may guard rules builder.fullName("First", "Last")... // manual builder var obj2 = obj1.withFullName("First", "Last"); // wither J Deeper model (new types) var obj2 = obj1.withFullName(new FullName("F", "L")); Code Smells Fragmented Immutable Builder >> Named parameters x = X(a=1,b=2,c=3,...) data.copy(a=1, b=2)