在基于Web的应用程序中,我们在每个登录用户的User
中都有一个session
对象。
用户如下
Class User {
//With setter and getters
private String userId,
private String name,
private Account Account,
}
Class Account {
//with setter and getters.
private String accountNumber;
}
当为用户创建用户登录会话对象时,他将为userId
设置name
和Account
。
之后,每个程序员都可以访问session
并阅读用户及其信息。但是有一个程序员可能会错误地更改Account
。
例如:
1. TrasnferVO = new TransferVO;
2. TransferVO.setAccount( user.getAccount() );
3. TransferVO.getAccount.setAccountNumber("foo");
4. User user = getUserFromSession();
5. user.getAccountNumber(); // Now I have foo
在 2 行,应创建一个新的副本用户帐户,并将其设置为TransferVO
,因为对象引用的传递不是其值!
因此, 3 行将更改用户会话帐号。我们将在会话中丢失已损坏的accountNumber
。
是否有任何指导方针来处理它,或者每个程序员都必须处理它。
当然,这个错误可能发生在项目的每个代码中,但我正在寻找一种方法来创建会话对象属性,这是非常重要的,不可变的。
答案 0 :(得分:1)
您的问题中的情况尚不清楚。
要制作immutable object in Java,您有两种方式:
private
,定义没有setter方法的接口,并在类上实现该接口。将对象作为该只读接口的实例传递给会话。final
。可以仅为成员分配对象(或原始值)的引用一次。标记为final
的成员无法重新分配。 请记住,在上述任何一种情况下,分配给成员的对象本身都可以修改。将对象分配给类的成员是我们在上述两种情况下都要保护的,但修改分配的对象自己的内部成员是一个单独的问题。
或者您可以复制一个对象,然后继续修改克隆。也许这最适合你的情况。
了解标记界面Cloneable
以及使用protected
覆盖public
Object::clone
方法的方法。读: