gpt4 book ai didi

java - 在 Java 中使 session 中的对象不可变

转载 作者:行者123 更新时间:2023-11-30 07:28:38 25 4
gpt4 key购买 nike

在基于 Web 的应用程序中,每个登录用户的 session 中都有一个User对象。

用户如下

Class User {
//With setter and getters
private String userId,
private String name,
private Account Account,
}

Class Account {
//with setter and getters.
private String accountNumber;
}

当用户登录时,会为他创建一个 session 对象,并为其设置他的 userIdnameAccount

之后,每个程序员都可以访问 session 并读取用户及其信息。但有可能一名程序员错误地更改了帐户

例如:

 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 行将更改用户 session 帐号。我们将在 session 中丢失损坏的 accountNumber

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

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

最佳答案

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

使对象不可变

制作 immutable object in Java ,你有两种方法:

  • 封装:将成员标记为私有(private),定义一个不带setter方法的接口(interface),并在您的类上实现该接口(interface)。将对象作为该只读接口(interface)的实例传递给您的 session 。
  • 将成员标记为最终。只能为成员分配对对象(或原始值)的引用一次。标记为 final 的成员无法重新分配。

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

复制对象

或者您可以制作对象的副本,然后在克隆上继续进行修改。也许这最适合您的情况。

了解标记界面 Cloneable以及关于覆盖 protected Object::clone方法与 public 方法。阅读:

关于java - 在 Java 中使 session 中的对象不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36477061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com