Поскольку в наши дни это горячая тема, я не понимаю определенной концепции. Пожалуйста, извините меня, если я говорю глупо, но когда я попытался создать неизменяемый объект, большинство сообщений, которые я нашел в следующих пунктах
- Сделать класс окончательным - имеет смысл
- Не разрешать мутаторы (сеттеры) для атрибутов - имеет смысл
- Сделать атрибуты private - имеет смысл
Теперь я не понимаю, почему нам нужны ниже точки
- Сделать конструктор закрытым и предоставить метод createInstance с теми же атрибутами, что и конструктор или метод factory? Как это помогает?
- Сделать атрибуты final - пост сообщения не может объяснить эту точку, а некоторые, где я читаю, чтобы избежать модификации случайно. Как вы можете случайно изменить, когда нет мутаторов, и класс является окончательным? Помогает ли создание атрибута final?
- Вместо шаблона factory можно ли использовать шаблон построителя?
Я добавляю свой класс и тестовый пример:
public final class ImmutableUser {
private final UUID id;
private final String firstName;
private final String lastName;
public ImmutableUser(UUID id, String firstName, String lastName) {
super();
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
/**
* @return the id
*/
public UUID getId() {
return id;
}
/**
* @return the firstName
*/
public String getFirstName() {
return firstName;
}
/**
* @return the lastName
*/
public String getLastName() {
return lastName;
}
}
Тестовая версия
public class ImmutableUserTest {
@Test(expected = IllegalAccessException.class)
public void reflectionFailure() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
ImmutableUser user = new ImmutableUser(UUID.randomUUID(), "john", "liu");
Field i =user.getClass().getDeclaredField("firstName");
i.setAccessible(true);
i.set(user, "cassandra");
System.out.println("user " + user.getFirstName()); // prints cassandra
}
}
Этот тестовый пример выходит из строя и печатает кассандру.
Сообщите мне, если я что-то делаю неправильно.