首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于防止改变对象内部不可变状态小例子

Java相对于c而言,是一门比较安全语言,免去了指针操作带来各种不安全因素,但是当你构建一个类,给别人提供接口,在交互过程也会带来不少麻烦,有时候甚至会改变对象内部可变状态,请看下面例子。...,有女友程序员朋友都知道,初次约会时候,女生最喜欢男友准时准点地在那里等,而不是干巴巴地让女孩子在等,等久了,是要删游戏装备,哈哈。...所以约会时间不能随意改变,在这里用了final关键字修饰(注意,final修饰变量,如果是基本类型,则值当然不可变,若是对象,指的是它不能指向其他对象,而引用对象本身是可变)。...那这是否意味着date不可变了呢,答案是否定,请看: Calendar cal = Calendar.getInstance(); cal.set(2016, 3, 22);...,还是有不少出差错可能,软件是一件需要不断精细打磨艺术品,所有的程序员都是工匠,是艺术家。

82090
您找到你想要的搜索结果了吗?
是的
没有找到

python可变对象和不可变对象解释

数据类型分为可变、不可变可变对象表示可以原处修改该数据对象,不可变对象表示必须创建新对象来保存修改后数据。...在基础数据类型中: 数值、字符串、元组、frozenset是不可变对象 列表、set、dict是可变对象 对于可变对象,比如有一个列表L,查看它id以及第一个元素id。...>>> L[0]="aa" >>> L ['aa', 'b', 'c'] >>> id(L) 23099392 发现列表id并没有改变,也就是列表内存地址仍然是那一块。这表示列表是可变序列。...但是,如果查看第一个元素id,会发现已经改变了: >>> id(L[0]) 61863232 这说明,虽然列表内存地址没有改变,但是列表中第一个元素地址已经改变了。...正如上面修改字符串"a"为"aa"结果。 假如列表L中第一个元素仍然是一个嵌套在L中列表,因为列表是可变对象,现在修改L第一个元素,这第一个元素地址不会改变

1.2K20

Python中可变对象和不可变对象

什么是可变/不可变对象可变对象,该对象所指向内存中值不能被改变。...当改变某个变量时候,由于其所指值不能被改变,相当于把原来值复制一份后再改变,这会开辟一个新地址,变量再指向这个新地址。 可变对象,该对象所指向内存中值可以被改变。...如果是可变对象add = aee,它们指向同一地址(id相同)是肯定。但不是同一对象不同引用,因为如果是的话,aee改变会引起add改变,再tuple中并不是这样。...所以tuple是不可变对象,但又和str和数值类型稍微有点区别。平常说tuple不可变更多时候是指里面存放值不能被改变(有些特殊情况,如tuple里面存放了list,可改变list里元素。...可变对象由于所指对象可以被修改,所以无需复制一份之后再改变,直接原地改变,所以不会开辟新内存,改变前后id不变。

1.3K50

Java中可变对象(Mutable)与不可变对象(Immutable)

如何在 Java 中创建不可变对象?我以前以为所有对象都是不可变,因为如果你改变一个 String 实例内容,它总是会创建一个新 String 对象并指向该对象。...Java 中可变类和不可变类是什么? 在 Java 中,可变类和不可变概念指的是对象创建后其状态是否可以更改。可变类是指实例创建后可以修改类,而不可变类一旦创建就不能改变其状态。...可变对象状态可以通过修改其字段或属性方法来改变。例如,StringBuilder 和 ArrayList 都是可变类。...Java 中不可变对象可变对象区别 以下是 Java 中可变类和不可变类之间一些主要区别: 1. 修改 可变对象在创建后可以修改,但不可变对象在创建后不能修改。 2....状态更改 可变对象允许更改状态,但不可变对象状态在创建时是固定。 4. 使用案例 当你需要经常修改对象,或想表示状态会随时间变化实体时,可变对象就派上用场了。

21630

117-可变与不可变对象效率

python是一种解释型语言,执行效率要比C这样编译型语言差得多,但是也应该注意它效率。...python各种数据类型,按更新模型可以分为可变类型(如列表、字典)和不可变类型(如数字、字符串和元组)。多使用可变类型,它执行效率比不可变类型要高。...在《37-生成密码/验证码》中,将结果保存到了一个名为 result 变量中。...result 是字符串,字符串不可变,所以python在工作时,首先要申请一段内存储 result 初值(空串''),随机取得一个字符后(如'a'),result += 'a'实际上是要重新申请一个新内存...如果变量 result 使用列表,只需要为其分配一次内存即可,因为列表是可变

49410

STRING对象可变原理

众所周知, 在Java中, String类是不可变。那么到底什么是不可变对象呢?可以这样认为:如果一个对象,在它创建完成之后,不能再改变状态,那么这个对象就是不可变。...从打印结果可以看出,s值确实改变了。那么怎么还说String对象是不可变呢?其实这里存在一个误区:s只是一个String对象引用,并不是对象本身。...“不可变对象。...但是一般我们这么做。这个反射实例还可以说明一个问题:如果一个对象,他组合其他对象状态是可以改变,那么这个对象很可能不是不可变对象。...例如一个Car对象,它组合了一个Wheel对象,虽然这个Wheel对象声明成了private final ,但是这个Wheel对象内部状态可以改变, 那么就不能很好保证Car对象可变

67440

jdk源码分析之HashMap--为什么key建议是可变对象

,那么我们首先抛出今天议题,为什么建议HashMapkey使用可变对象呢?...更进一步说,为什么有些公司或团队强制使用HashMapkey使用String,Long等等不可变对象呢?...在详细介绍答案之前,再问一个问题,在代码使用层面,如果key是可变对象,对我们get查询操作有影响吗?有什么影响? 首先,还是先看一下get方法代码: ?...那假如说key是可变对象,比如说key是一个人,value是他工作信息,第一次put之后,插入到Entry 数组具体位置,那如果这个key对应的人对象内部属性发生变化,体重变动,那么会导致key...Map实例时候,根据业务场景尽可能避免使用可变对象作为key,最常用就是 Map或者Map。

47340

Vue 改变数据,页面刷新问题

看了一下代码,发现修改数据代码是这样 // popupData是修改数据,修改完后,赋值给对应表格数据 this.tableData[this.currentRow] = this.popupData...注意事项(以下内容摘自官方文档) 由于 JavaScript 限制,Vue 不能检测以下数组变动: 当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue...当你修改数组长度时,例如:vm.items.length = newLength 举个例子: var vm = new Vue({ data: { items: ['a', 'b',...'c'] } }) vm.items[1] = 'x' // 不是响应性 vm.items.length = 2 // 不是响应性 为了解决第一类问题,以下两种方式都可以实现和 vm.items...$set 实例方法,该方法是全局方法 Vue.set 一个别名: vm.

3.3K10

改变python对象规则黑魔法metaclass

今天小明哥要分享主题是:改变类定义神器-metaclass 看到标题,你可能会想改变定义有什么用呢?什么时候才需要使用metaclass呢?...Python类上帝-type 说到metaclass,我们首先必须清楚一个最基础概念就是对象是类实例,而类是type实例,重复一遍: 对象是类实例 类是type实例 在面向对象编程模型中,...你可能感受不到这有多强大,要知道想在静态语言运行期创建类,必须构造源代码字符串再调用编译器,或者借助一些工具生成字节码实现,本质上都是动态编译,会非常复杂。...虽然metaclass编写会比较复杂,但ORM使用者用起来却异常简单。...metaclass 是 Python 黑魔法级别的语言特性,它可以改变类创建时行为,这种强大功能使用起来务必小心。 看完本文,你觉得装饰器和 metaclass 有什么区别呢?

40720

DDD系列:什么是“值对象是不可变

软件系统是物理世界映射。在一个没有出现任何变化物理世界中,是没有必要开发一个软件系统来提高效率。那么值对象“不可变”具体是指什么不可变呢?值对象可变,为什么实体就可变了呢?...不可变,是指软件系统中能够唯一确定一个主体属性不可变。从这个维度来看实体和值对象都不可变。 不可变,不是说软件系统中这些关键属性一旦持久化,就不能修改了。是可以修改。...走两步: 场景一:操作日志 软件系统中操作日志格式一般是“什么时间什么人进行了什么操作”。 什么人,在软件系统中如何表示呢?操作人ID。不可变,是指操作人ID相同。...只要这四个属性相同,就代表了物理世界上相同位置。 值对象领域模型与数据模型示例 不可变,是指一个人员省、市、县、街道四个属性任何一个改变了,就变成一个新地址了。...即这个人员在软件系统中地址就映射到了物理世界中另一个位置了。这个人员老地址在软件系统中找不到了。不可变,指代表业务含义不可变

90210

Java并发-推荐使用不可变对象原因分析

---- 二、不可变对象 2.1 什么是不可变对象 其实不光是String对象,Java中很多对象都符合上述不可改变状态特性。...不可变对象所提供方法,不会改变自身状态,最多构造一个新状态对象返回,这也与上述思路完全契合。...比如颜色数值和颜色名可以因为多线程调动而对应上。 3.2定义不可变对象策略 以下一些规则是创建不可变对象简单策略。...并非所有不可变类都完全遵守这些规则,不过这不是编写这些类程序员们粗心大意造成,很可能是他们有充分理由确保这些对象在创建后不会被修改。但这需要非常复杂细致分析,并不适用于初学者。...2)共享可变对象引用。当一个引用被当做参数传递给构造函数,而这个引用指向是一个外部可变对象时,一定不要保存这个引用。如果必须要保存,那么创建可变对象拷贝,然后保存拷贝对象引用。

56720

JavaScript面试卷(二) -- 复杂创建对象模型

接着上一篇文章说,上一篇创建对象没有向外部提供直接设置属性值入口。都是在new 创建对象时,给定默认值。 本文在创建新实例时指定属性值。...name 和 dept 属性则不是 amy 对象本地,而是从 amy 对象 __proto__属性获得。...修改所有后代某属性值 如果想在运行时修改一个对象属性值并且希望该值被所有该对象后代所继承,您就不能在该对象构造器函数中定义该属性。而应该将该属性添加到该对象所关联原型中。...因而,修改Foo.prototype 属性,将改变所有通过 new Foo() 创建对象属性查找。...因此,通过“原型继承(prototype inheritance)”,对象与其他对象之间形成关系。通过比较对象 __proto__ 属性和函数prototype 属性可以检测对象继承关系。

57820

小心此坑:Python 函数参数默认值是可变对象

看到了有给 Python 函数参数默认值传递可变对象,以此来加快斐波那契函数递归速度,代码如下: def fib(n, cache={0: 0, 1: 1}): if n not in cache...n - 2) return cache[n] 是不是很新奇,居然可以这样,速度真的非常快,运行结果如下: 不过,我劝你不要这样做,而且 IDE 也会提示你这样做很不好: 这是因为,万物皆对象...,Python 函数也是对象,参数默认值就是对象属性,在编译阶段参数默认值就已经绑定到该函数,如果是可变对象,Python 函数参数默认值在会被存储,并被所有的调用者共享,也就是说,一个函数参数默认值如果是一个可变对象...id 是一样,说明它们用到是 li 是同一个,这就参数默认值是可变对象逻辑,对于所有的调用者来讲,是共享。...最好方式是不要使用可变对象作为函数默认值。

98310

java:BeanProperSupport实现复杂类型对象成员访问

PropertyUtilsBean 在实际工程设计中,当我们设计了一个复杂数据对象对象中还嵌套有子对象,子对象可能还会有更多嵌套时,如果没有工具辅助,要获取一个对象子成员下子成员,需要写好几行代码逐级获取...往涉及到这种复杂多级嵌套子成员变量读写,程序代码都会变得很臃肿,繁琐。...为了实现对复杂数据对象子成员读写,需要支持嵌套多级字段名表达式定义字段名。...然后使用相同方法查询为此属性返回对象,以获取名为 属性属性获取器name2,依此类推。最终检索或修改属性值是由最后一个名字节点元素标识值。...写操作支持自动尝试创建成员对象,即当要访问嵌套字段名 name1.name2.name3中任何一个中间节点为null时会尝试创建一个空节点以最大限度能让节点遍历进行下去。

1.7K20

手撸了一个Java可变对象,很哇塞!

https://github.com/itwanger/toBeBetterJavaer 01、什么是不可变类 一个类对象在通过构造方法创建后如果状态不会再被改变,那么它就是一个不可变(immutable...其中,synchronized(同步)关键字是最简单最入门一种解决方案。 假如说类是不可变,那么对象状态就也是不可变。...这样的话,每次修改对象状态,就会产生一个新对象供不同线程使用,我们程序员就不必再担心并发问题了。 02、常见可变类 提到不可变类,几乎所有的程序员第一个想到,就是 String 类。...虽然调用 substring() 方法对 cmower 进行了截取,但 cmower 值没有改变。...为了解决这个问题,我们需要为不可变定义规则追加一条内容: 如果一个不可变类中包含了可变对象,那么就需要确保返回可变对象副本。

25710

Python 函数中使用默认值参数 — 谈谈可变对象坑?!

参数默认值:  使用可变对象使用不可变对象 默认参数使用可变对象会怎样?  先复原需求  定义一个函数,为传入列表(list)尾部添加一个“end”元素。 ...(列表是一个可变对象 —— 这是重点) 再看执行过程:     1. ...3. print(addend(lst))  当调用函数并传入实参(lst)时候,并不是把lst列表中内容拷贝到lt列表中,而是使lt指向对象发生了改变,使lt也指向了lst指向空间,这样,lt...:  当函数定义中默认参数赋值为可变对象时候,PyCharm会自动检测并加以提示,如下所示:  点击“more...”...该检查检测何时在参数默认值中检测到列表或字典等可变值。默认参数值只在函数定义时计算一次,这意味着修改参数默认值将影响函数所有后续调用。  如果函数默认参数使用不可变对象又会怎样呢?

1.4K00
领券