【发布时间】:2014-08-24 01:52:07
【问题描述】:
由于这是最近的热门话题,我无法理解某些概念。如果我听起来很愚蠢,请原谅我,但是当我尝试创建不可变对象时,我发现大多数帖子都遵循以下几点
- 使类最终化 - 有意义
- 不允许属性的修改器(设置器) - 有意义
- 将属性设为私有 - 有意义
现在我不明白为什么我们需要以下几点
- 将构造函数设为私有并提供与构造函数或工厂方法具有相同属性的 createInstance 方法?它有什么帮助?
- Make attributes final - 帖子的帖子未能解释这一点以及我阅读的一些内容以避免意外修改。当没有 mutators 并且 class 是 final 时,你怎么能不小心修改呢?如何使属性最终有帮助?
- 我可以使用建造者模式代替工厂模式吗?
我在这里添加我的课程和测试用例:
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。
如果我做错了什么,请告诉我。
【问题讨论】:
-
这个问题更适合programmers.stackexchange.com。
-
似乎你在混合可变性和单例。
-
不,我明白什么是单例。这让我很困惑docs.oracle.com/javase/tutorial/essential/concurrency/…
标签: java immutability