如何在java中使对象不可变
由于这是当今的热门话题,我无法理解某些概念。请原谅我,如果我听起来很愚蠢,但当我尝试创建不可变对象时,我发现大多数帖子我都发现以下几点
- 使课程最终 - 有意义
- 不允许属性的赋值器(setters) - 有意义
- 使属性私有 - 有意义
现在我不明白为什么我们需要以下几点
- 将构造函数设为私有,并提供与构造函数或工厂方法具有相同属性的 createInstance 方法?它有什么帮助?
- 使属性最终 - 帖子的帖子未能解释这一点,以及我阅读的一些地方,以避免意外修改。当没有突变体并且类是最终的时,如何意外修改?使属性最终确定如何有所帮助?
- 我可以使用生成器模式来代替工厂模式吗?
我在这里添加我的类和测试用例:
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
}
}
此测试用例失败并打印 cassandra。
如果我做错了什么,请告诉我。