
以前不觉得,现在发现这种设计真的是有毒。
java 原生的深拷贝方法麻烦无比,用 gson 来做深拷贝简单点,但是为了避免栈溢出,一些存在相互引用可能的类型需要加上 transient,并且在深拷贝后再把 transient 变量赋值进去。
其实像 go 那样使用肥指针就不会有这么多幺蛾子了。。
1 weixiangzhe Aug 24, 2019 via iPhone 貌似大部分对象都是引用赋值了吧 rust 的借用是不是可以满足楼主 |
2 reus Aug 24, 2019 说要加 value types 好几年了 |
3 chendy Aug 24, 2019 其实是 值传递,传递了引用的值… |
4 soulzz Aug 24, 2019 主要是省空间,赋新值就开辟个新空间有些浪费 但问题也很蛋疼,每次我解决深拷贝的问题都是序列化再反序列化感觉更浪费资源了 |
5 zifangsky Aug 24, 2019 3L 说得对 |
8 pursuer Aug 24, 2019 大概因为引用传递适合大部分的情况,所以就默认使用引用传递。值拷贝在处理复杂对象时不一定把一块内存复制过去就可以了,所以 c++为了处理这个情况还搞了个复制构造函数,Java 中对应的就是 clone 方法,只是 Java 默认是引用传递,c++默认是值传递 |
9 gramyang OP @chendy 我知道,网上很多答案都这么说,原理也确实是如此。所有的代码的行为几乎都是值传递,取值和赋值,指针也是值传递,但是我觉得还是有必要把复制指针和复制指针指向的值区别开来 |
10 danc Aug 24, 2019 所以,rust 应该能满足大佬的需求,想要传引用就&T, 想要拷贝就 T.clone() |
12 EmdeBoas Aug 24, 2019 <dependency> <groupId>uk.com.robust-it</groupId> <artifactId>cloning</artifactId> </dependency> |
13 laminux29 Aug 24, 2019 C/C++中的: *p **p ***p p + (b + (a*n) ) 题主,以上你都能快速理解吗?你猜猜考试中,全能理解的有多少? |
14 middleware Aug 25, 2019 Value type 的 life cycle 不能统一由 GC 控制,语法必然复杂化。 |
15 Raymon111111 Aug 25, 2019 BeanUtils.copyProperties |
16 wysnylc Aug 25, 2019 为了解决一个问题带出来更多问题 |
17 Takamine Aug 25, 2019 via Android 看到标题的时候我觉得是个伪命题阿。 话说想到之前一个问题,Java 到底是只有值传递还是也有引用传递:doge:。 |
18 Sasasu Aug 25, 2019 via Android 没理解 go 里的胖指针是什么 指 interface 的话,胖指针让编译器失去了很多优化的机会,让 go 程序员不得不手动检查的函数的逃逸分析,编译器升级后还要再检查一遍。 指带长度的 slice 的话 Java 里也有 object[],而且还不会 cow |
19 watzds Aug 25, 2019 via Android C++里不也喜欢传指针,Java 这样简单 |
20 cyspy Aug 25, 2019 首先是因为 Java 除了八种基本类型之外都在堆里分配,有点原教旨的面向对象了,更现代的语言一般都把小 struct 分配在栈上 |
21 Aresxue Aug 26, 2019 两个原因,快还有"懒"。快是指针存在虚拟机栈里,copy 起来速度奇快,"懒"是 JVM 的实现人员觉得没必要为 1%的场景去花费太多精力,有那空不如研究研究垃圾收集器啥的。。。不过听说新版本好像有这个意向? |
22 shm7 Aug 27, 2019 因为快吧。 |