可变对象与不可变对象

2024-01-06

我正在尝试了解可变对象与不可变对象。使用可变对象会受到很多负面影响(例如从方法返回字符串数组),但我很难理解这样做的负面影响。使用可变对象的最佳实践是什么?您应该尽可能避免它们吗?


嗯,这有几个方面。

  1. 没有引用标识的可变对象可能会在奇怪的时候导致错误。例如,考虑一个Person具有基于值的beanequals method:

    Map<Person, String> map = ...
    Person p = new Person();
    map.put(p, "Hey, there!");
    
    p.setName("Daniel");
    map.get(p);       // => null
    

    The Person当用作键时,实例会在映射中“丢失”,因为它hashCode平等是基于可变的价值观。这些值在地图之外发生了变化,所有散列都变得过时了。理论家喜欢在这一点上喋喋不休,但在实践中我并没有发现这是什么太大的问题。

  2. 另一方面是代码的逻辑“合理性”。这是一个很难定义的术语,涵盖了从可读性到流程的所有内容。一般来说,您应该能够查看一段代码并轻松理解它的作用。但更重要的是,你应该能够说服自己它的作用正确地。当对象可以在不同的代码“域”之间独立更改时,有时很难跟踪什么在哪里以及为什么(“远处的怪异动作 https://en.wikipedia.org/wiki/Action_at_a_distance_%28computer_programming%29”)。这是一个更难以举例说明的概念,但它是在更大、更复杂的架构中经常面临的问题。

  3. 最后,可变对象是killer在并发情况下。每当您从单独的线程访问可变对象时,您都必须处理锁定。这会降低吞吐量并使您的代码戏剧性地更难维护。一个足够复杂的系统会使这个问题变得过分严重,以至于几乎不可能维护(即使对于并发专家来说也是如此)。

不可变对象(更具体地说,不可变集合)避免了所有这些问题。一旦你了解了它们的工作原理,你的代码就会变得更容易阅读、更容易维护,并且不太可能以奇怪和不可预测的方式失败。不可变对象甚至更容易测试,这不仅是因为它们易于模拟,而且还因为它们倾向于强制执行的代码模式。简而言之,它们都是很好的练习!

话虽如此,我对这件事并不是一个狂热分子。当一切都是不可变的时,有些问题就无法很好地建模。但我确实认为您应该尝试将尽可能多的代码推向这个方向,当然假设您使用的语言使这一观点站得住脚(C/C++ 使这变得非常困难,Java 也是如此) 。简而言之:优点在某种程度上取决于您的问题,但我倾向于更喜欢不变性。

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

可变对象与不可变对象 的相关文章

  • 静态类属性上的 isset

    class A public static foo 42 class A attribute foo var dump isset class attribute gives bool false 我如何检查这个类中是否存在这个静态属性 U
  • 初始化父类时如何返回子类的新实例?

    给定一个类层次结构如下 class A def initialize param if param 1 then initialize and return instance of B else initialize and return
  • 为什么json序列化器不符合多态性?

    我在 NET 4 5 Windows 应用商店应用程序中使用库存 JSON 序列化器 System Runtime Serialization Json DataContractJsonSerializer 我有一个由 API 提供商提供的
  • 预期设备类型为 cuda 的对象,但在 Pytorch 中获得了设备类型 cpu

    我有以下计算损失函数的代码 class MSE loss nn Module metric L1 L2 norms or cosine similarity mode training or evaluation mode def init
  • Mootools 使用“extend”方法扩展“Function”类,导致 jQuery 无法使用

    Mootools 扩展了 Function 类 并在其中添加了一个名为 extend 的新方法 现在 jQuery 尝试使用 jQuery prototype extend 添加 扩展 功能 然而 由于 extend 已经是 jQuery
  • 参数过多的类:更好的设计策略?

    我正在研究神经元模型 我正在设计的一个类是细胞类 它是神经元 几个连接在一起的隔室 的拓扑描述 它有很多参数 但它们都是相关的 例如 轴突段数 顶端二纤化 体细胞长度 体细胞直径 顶端长度 分支随机性 分支长度等等等等 总共大约有15个参数
  • PHP 特性 - 定义通用常量

    定义可由命名空间内的多个类使用的常量的最佳方法是什么 我试图避免过多的继承 因此扩展基类不是理想的解决方案 并且我正在努力寻找使用特征的良好解决方案 这在 PHP 5 4 中是否可行 或者应该采取不同的方法 我有以下情况 trait Bas
  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 列出某个类的所有对象

    好的 我的问题如下 我有一个用这个构造函数描述宠物的类 public function construct name type age 所以我想做的是制作一些宠物对象 然后我想打印这个类的所有对象的所有属性 这样它看起来像this http
  • 两个对象相互依赖。那不好吗?

    当我为我的项目构建自己的系统时 我学到了很多关于设计模式的知识 我想问你一个我找不到答案的设计问题 目前我正在使用套接字构建一个带有多个客户端的小型聊天服务器 现在我有三门课 人级其中包含昵称 年龄和房间对象等信息 房间级它保存诸如房间名称
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • Erlang:如何将原子转换为字符串?

    我想从原子转换为字符串 Input hello world Output hello world 我该如何实现这一目标 Use atom to list http erlang org doc man erlang html atom to
  • 一个类应该验证自身还是创建另一个类来验证它?

    假设我有一堂课 class NavigationData float roll float pitch double latitude double longitude 如果我想创建一个方法 const bool validate cons
  • 检查 Objective-C 块类型?

    这主要是出于好奇 我不太确定它的实际用途是什么 但就这样吧 由于块也是 Objective C 对象 是否可以检查它们的类型 也就是说 它是否响应isKindOfClass 消息以及如何使用该消息来处理块 我天真的以为事情大概是这样的 vo
  • Javascript:我应该隐藏我的实现吗?

    作为一名 C 程序员 我有一个习惯 将可以而且应该私有的东西设为私有 当 JS 类型向我公开其所有私有部分时 我总是有一种奇怪的感觉 而且这种感觉并没有被 唤起 假设我有一个类型draw方法 内部调用drawBackground and d
  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • 在javascript中访问函数内的实例变量?

    如何以最简单的方式访问函数内的实例变量 function MyObject Instance variables this handler Methods this enableHandler function var button doc
  • 使用面向对象的分析和设计对电梯进行建模[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当涉及到面向对象的设计和分析时 有一组问题似乎在面试和课堂上很常见 这是其中之一 不幸的是 我在大学的 OOP 教授从未真正给出过答案 所以我一

随机推荐

  • MVC - 动态加载部分视图

    我试图通过传递我想要的部分视图的路径列表 然后在每个视图上调用 RenderPartial 来将部分视图动态加载到视图中 这似乎可以解决问题 当我尝试将模型传递到局部视图时 问题就出现了 由于我动态加载它们 因此我不确切知道要为特定的部分视
  • 通过函数指针间接完美转发?

    让我们考虑一下普通的完美转发 class Test public Test default Test Test const std cout lt lt copy n Test Test std cout lt lt move n void
  • Meteor.user() 错误:未捕获类型错误:无法读取 null 的属性“名称”

    我正在使用 Meteor 框架 当我尝试将当前用户的名称返回给模板助手时 出现了此错误 Template user userName function return Meteor user name
  • 计时器无法正确触发

    我使用计时器来切换布尔值 但它并没有像预期那样每 250 毫秒触发一次 而是尽可能快地触发 这是我的代码 package com cgp tetris import java awt Graphics import java awt eve
  • brms:如何设置分类变量的优先级?

    我正在使用 2 个分类变量构建二项式回归模型 这是 统计反思 一书中的一个例子 在书中 在使用 rethinking 包时 我们可以对每个分类变量设置先验 如下所示 m11 5 lt ulam alist pulled left dbino
  • JPA 本机查询删除

    我尝试使用此本机查询从表中删除行列表 NamedNativeQuery name WebGroup DeleteIn query DELETE FROM WebGroup WHERE WebGroup GROUP ID IN IDsList
  • Eclipse 中包含 Android-DirectionalViewPager .jar 时出错

    我正在尝试在我的应用程序中实现垂直滑动 就像用浏览器 http android developers blogspot de 2011 08 horizontal view swiping with viewpager html 但垂直 我
  • 使用 Mockito 使用 @Transactional 方法模拟类

    我有一个服务 一个 bean 其中包含 Transactional method public class InMessageService Transactional public boolean retryInMessage Strin
  • Backbone.js - 通过构造函数传递参数

    设想 我得到了一个alert saying undefined当我 尝试 设置myVar通过构造函数变量 但是如果我取消注释myVar它位于 myView 内部 然后警报会显示 Hello from inside 正如人们所期望的那样 问题
  • 如何使用 SwiftUI 实现具有样式、文本和图标的可重用按钮?

    我知道如何定制ButtonStyle作品 但我确实想要一个完全可重用的自定义按钮 又名带有文本和图标的按钮 应用了一些样式 我知道如何使用带有文本属性的 ButtonStyle 来实现此目的 但我认为这完全是对按钮样式的滥用 但我不想复制一
  • Flask/SQLAlchemy - 多对多关系的关联模型和关联表之间的区别?

    我从 Flask Mega 教程开始学习这些东西 当他进入多对多关系时 他创建一个如下所示的关联表 followers db Table followers db Column follower id db Integer db Forei
  • 创建虚拟机 X 时出错 资源 Y 请求的大小当前在位置 Z 中不可用

    我目前已在 Azure 中创建了测试实验室 当我尝试创建Ubuntu Server 14 04 LTS它不断失败并显示以下错误消息 创建虚拟机 TestVMUbuntu 时出错 请求的大小 对于资源 subscriptions resour
  • 如何在 LINQ-to-SQL 中编写此交叉应用查询?

    我有以下表格 create table TableA Id int primary key identity Key int not null create table TableB Id int primary key identity
  • https://pubsubhubbub.appspot.com/ 实际上是如何运作的以及我期望收到什么样的响应?

    今天是个好日子 出于上下文目的 我正在尝试监视 Youtube 频道 每当他们发布新视频时 我都会收到通知并处理该条目 我做了什么 a 设置回调 URL 来接收和回复集线器质询 b https pubsubhubbub appspot co
  • 使用通用 JSON 对象作为请求正文

    我有一个接收 JSON 对象作为输入的控制器 但问题是 JSON 的内容会根据不同的请求而变化 所以我无法映射RequestBody到 POJO 有没有办法可以将输入参数指定为通用参数JSONObject无需指定特定的 POJO 我试过 R
  • Hibernate 可以与 akka actor 一起使用吗?

    我主要关心的是ThreadLocal akka actor 不绑定到特定线程 因此任何线程本地存储的使用都会在 akka actor 上出现问题 Hibernate 使用ThreadLocal 在这种情况下它们可以共存吗 是的 我将 Hib
  • 将 Redis 容器与另一个容器连接 (Docker)

    因此 我正在做一个项目 其中有两个 Docker 容器 一个用于主应用程序 一个用于 Redis 顺便说一句 使用 docker compose 当然 我想连接两者并尝试默认的绑定设置 但当然应用程序无法连接到数据库 因为它们位于两个不同的
  • 如何访问 MDM 设置的 UWP 应用程序设置?

    我正在使用 EnterpriseModernAppManagement CSP 来安装和设置某些 UWP 应用程序的设置 如下定义 https msdn microsoft com en us library windows hardwar
  • 如何使用Android.mk中的gradle变量?

    请问 我想知道如何使用 Android mk 文件中 gradle 定义的变量 或者是否有办法将某些变量从 gradle 传递到 Android mk 我知道这个问题看起来很奇怪 但我尝试了很多可能性 但没有成功 事实上 我正在与同学合作开
  • 可变对象与不可变对象

    我正在尝试了解可变对象与不可变对象 使用可变对象会受到很多负面影响 例如从方法返回字符串数组 但我很难理解这样做的负面影响 使用可变对象的最佳实践是什么 您应该尽可能避免它们吗 嗯 这有几个方面 没有引用标识的可变对象可能会在奇怪的时候导致