使会话中的对象在Java

时间:2016-04-07 13:03:13

标签: java immutability

在基于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设置nameAccount

之后,每个程序员都可以访问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

是否有任何指导方针来处理它,或者每个程序员都必须处理它。

当然,这个错误可能发生在项目的每个代码中,但我正在寻找一种方法来创建会话对象属性,这是非常重要的,不可变的。

1 个答案:

答案 0 :(得分:1)

您的问题中的情况尚不清楚。

使对象不可变

要制作immutable object in Java,您有两种方式:

  • 封装:将成员标记为private,定义没有setter方法的接口,并在类上实现该接口。将对象作为该只读接口的实例传递给会话。
  • 将成员标记为final。可以仅为成员分配对象(或原始值)的引用一次。标记为final的成员无法重新分配。

请记住,在上述任何一种情况下,分配给成员的对象本身都可以修改。将对象分配给类的成员是我们在上述两种情况下都要保护的,但修改分配的对象自己的内部成员是一个单独的问题。

复制对象

或者您可以复制一个对象,然后继续修改克隆。也许这最适合你的情况。

了解标记界面Cloneable以及使用protected覆盖public Object::clone方法的方法。读: