具有 ArrayList 成员变量的不可变对象 - 为什么可以更改该变量?

2024-03-27

我有一个包含各种成员变量的类。有一个构造函数,有 getter 方法,但没有 setter 方法。事实上,这个对象应该是不可变的。

public class Example {
   private ArrayList<String> list; 
}

现在我注意到以下内容:当我使用 getter 方法获取变量列表时,我可以添加新值等等 - 我可以更改ArrayList。当我下次打电话时get()对于这个变量,改变了ArrayList被返回。怎么会这样?我没有再设置,我只是努力而已! 与一个String这种行为是不可能的。那么这里有什么区别呢?


只是因为参考资料列表是不可变的并不意味着列表它指的是to 是不可变的。

Even if list被做了final这是允许的

// changing the object which list refers to
example.getList().add("stuff");

但这会not允许:

// changing list
example.list = new ArrayList<String>();   // assuming list is public

为了使列表不可变(也防止第一行),我建议您使用Collections.unmodifiableList http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#unmodifiableList%28java.util.List%29:

public class Example {
    final private ArrayList<String> list;

    Example(ArrayList<String> listArg) {
        list = Collections.unmodifiableList(listArg);
    }
}

(请注意,这会创建一个不可修改的列表视图。如果有人保留原始引用,则仍然可以通过该视图修改列表。)


对于字符串,这种行为是不可能的。那么这里有什么区别呢?

那是因为一个String已经是不可变的(不可修改的),就像将列表变成不可修改的列表一样。

比较:

              String data structure  | List data structure
           .-------------------------+------------------------------------.
Immutable  | String                  | Collection.unmodifiableList(...)   |
-----------+-------------------------+------------------------------------|
Mutable    | StringBuffer            | ArrayList                          |
           '-------------------------+------------------------------------'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有 ArrayList 成员变量的不可变对象 - 为什么可以更改该变量? 的相关文章

  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类

随机推荐

  • CodeIgniter 会话 set-cookie 重复 - 如何解决

    UPDATE 我想知道是否有人可以查看我的答案并看看其中是否有任何漏洞 使用 codeigniter 和会话时存在一个有据可查的问题 codeigniter 标头中重复的 set cookie ci session 字段 https sta
  • 具有以字符串开头的属性的元素的 jQuery 选择器

    我需要选择所有具有以给定前缀开头的属性的元素 注意我说的是属性名称 not价值 例如 div div a href a span span 在上面的 HTML 中 我需要获取具有以下属性开头的所有元素data abc 那就是div和a 我怎
  • 如何使用官方Python客户端从Pod中查找同一节点上的所有Kubernetes Pod?

    如何使用官方 Python Kubernetes 客户端获取与我自己的 特权 pod 在同一 Kubernetes 节点上运行的 pod 列表 也就是说 Pod 如何识别其运行的具体 Kubernetes 节点 然后仅查询该节点上的完整 P
  • 尽管访问了正确的广告代码,但 Google DFP 广告素材还是随机显示

    我正在使用 Android 版 Google DFP DoubleClick for Publishers 广告 和 iPhone 设备 我想在特定的屏幕尺寸上展示广告 适用于 iOS 和 Android 中横向模式下的应用程序 我已经创建
  • 如何在Android中截取应用程序屏幕的屏幕截图?

    我正在开发一个应用程序 我必须在其中截取应用程序屏幕的屏幕截图 现在我使用下面的代码它不起作用 我是空位图图像 Process sh Runtime getRuntime exec su null null OutputStream os
  • Python 字典中数组的交集

    我有数组字典 如下所示 y dict 1 np array 5 124 169 111 122 184 2 np array 1 2 3 4 5 6 111 184 3 np array 169 5 111 152 4 np array 0
  • TabControl的SelectionChanged事件问题

    我正在 WPF 上工作 我正在创建一个 userControl 其中包含一个 TabControl 其中有一些 TabItem 当所选选项卡更改时 我需要执行一些操作 因此 我尝试做的是使用该事件myTabControl Selection
  • 如何在 PHP 中查找并打印两个数字之间的所有数字?

    现在我要求用户提供两个号码 我正在尝试打印 one 和 two 之间的数字 假设 one 小于 two range http php net manual en function range php给出一个包含所有数字的数组 您可以迭代它
  • 字符串到整数

    假设你有字符串 Hi 你如何得到一个值8 9 H 是字母表中的第 8 个字母 并且 i 是第 9 个字母 然后说 添加1到这些整数并使其9 10然后可以将其重新放入字符串中 Ij 是否可以 Note卡里 斯沃夫兰 Cary Swovelan
  • 创建独特的页面标题 slugs php

    我有一个为页面标题创建独特的标题的功能 它检查该 slug 在页面表中是否可用 然后通过相应地添加 int 来创建唯一的 slug 该函数对于前三个条目运行良好 例如 输入三次 test slug 将创建 test slug 1 test
  • R:如何组合三个数据帧的A列和B列相同的行,并添加相应的C列[重复]

    这个问题在这里已经有答案了 我有一些数据框 如果它们的前两列相同 我想合并它们 并添加相应的第三列 例如 我有三个数据框 如下所示 gt dump1 a b c q 12 2 w 23 3 e 34 4 gt dump2 a b c q 1
  • 将 ldapjs 与 Bluebird Promise 结合使用

    我在这里发布了类似的内容 使用带有 Promise 的 ldapjs https stackoverflow com questions 30682597 use ldapjs with promise 不幸的是 它仍然没有解决 这次我尝试
  • 查找临时表的列名[重复]

    这个问题在这里已经有答案了 我需要找到列名 of 临时表 如果它是物理表那么我们可以使用sys columns or Information schema columns系统视图来查找列名称 同样 有没有办法找到临时表中存在的列名 SELE
  • 寻找一种简单、简约的方式在云端存储小数据包

    我正在寻找一个非常简单且免费的小数据包云存储 基本上 我想编写一个 Greasemonkey 脚本 用户可以在具有共享数据集的多台计算机上运行该脚本 数据主要只是一个数字 每个用户八个字节就足够了 这一切都归结为以下要求 易于开发 这是一个
  • MATLAB 支持嵌套变量作用域吗?

    MATLAB 可以定义像以下类伪 C 代码那样的变量吗 int a 0 int b c int a 42 b a c a 我们可以使用嵌套函数来 模拟 这一点 我们可以不使用函数来做到这一点吗 我问这个问题是因为我想将一些 C 代码转换为
  • 如何在 MPAndroidChart 中从右向左绘制数据?

    我最近更新了MPAndroid图表 https github com PhilJay MPAndroidChart从1 7 4到2 0 9的库 我忘记了我做了什么自定义折线图以使数据从右到左显示 有人知道吗 我想知道是否有一种方法可以调用来
  • 访客模式示例

    public class Song public string Genre get protected set public string Name get protected set public string Band get prot
  • GUI 被 uibackgroundmodes= voip, audio 困住

    我有基于选项卡栏的应用程序 当我放入 plist UIBackgroundModes 时 我的应用程序应该支持 voip GUI 不会加载 它在启动屏幕上很糟糕 并且不会加载第一个选项卡视图 当我从 info plist 中删除 UIBac
  • UIImage 减少字节大小

    我正在使用以下代码来调整图像大小 一切正常且符合预期 以正确的方式调整 UIImage 的大小 http vocaro com trevor blog 2009 10 12 resize a uiimage the right way 我使
  • 具有 ArrayList 成员变量的不可变对象 - 为什么可以更改该变量?

    我有一个包含各种成员变量的类 有一个构造函数 有 getter 方法 但没有 setter 方法 事实上 这个对象应该是不可变的 public class Example private ArrayList