在 Java 中,**不可变类(Immutable Class)**是指对象一旦创建,其状态(字段值)就不能被修改的类(如 String、Integer)。
“测试不可变类”通常有两层含义:
下面从测试思路 + 示例代码两方面说明。
private final测试方式
@Test
public void testNoSetter() {
Field[] fields = User.class.getDeclaredFields();
for (Field f : fields) {
assertFalse(Modifier.isPublic(f.getModifiers()));
assertTrue(Modifier.isFinal(f.getModifiers()));
}
}
@Test
public void testImmutability() {
User u1 = new User("Tom", 18);
User u2 = u1;
// 尝试通过任何方式修改
// u1.setName("Jack"); // 编译错误,说明不可变
assertEquals("Tom", u1.getName());
assertEquals(18, u1.getAge());
}
如果字段是可变对象(如 Date、List),必须深拷贝。
public final class User {
private final Date birthDate;
public User(Date birthDate) {
this.birthDate = new Date(birthDate.getTime()); // 防御拷贝
}
public Date getBirthDate() {
return new Date(birthDate.getTime());
}
}
测试防御性拷贝
@Test
public void testDefensiveCopy() {
Date d = new Date();
User u = new User(d);
d.setTime(0); // 修改原对象
assertNotEquals(0, u.getBirthDate().getTime());
}
public final class User {}
测试:
@Test
public void testClassIsFinal() {
assertTrue(Modifier.isFinal(User.class.getModifiers()));
}
不可变对象常用于 Map / Set,行为必须稳定。
@Test
public void testEqualsStable() {
User u1 = new User("Tom", 18);
User u2 = new User("Tom", 18);
assertEquals(u1, u2);
assertEquals(u1.hashCode(), u2.hashCode());
}
User u = User.of("Tom", 18);
User u2 = u.withAge(20);
assertNotSame(u, u2);
测试:
@Test
public void testWithMethod() {
User u1 = new User("Tom", 18);
User u2 = u1.withAge(20);
assertEquals(18, u1.getAge());
assertEquals(20, u2.getAge());
}
assertThat(u1).isNotSameAs(u2);
一个不可变类测试是否合格,看这几点:
finalprivate final如果你愿意,我可以帮你写一个完整的不可变类 + 对应测试示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。