我目前正在为 Java 开发图形库。如您所料,存在一个 Vertex类(class)。该类包含类型为 VertexData<T> 的对象而它本身可以包含任何东西。
(我知道这可能是多余的,我可以做 Vertex<T> 但为了这个问题的目的,这并不重要)。
我做了VertexData<T>实现 Cloneable并且有一个public VertexData<T> clone()通过序列化和反序列化调用返回深拷贝的方法 Object ,非常像描述的here
现在的问题是,既然我有一个深拷贝方法,那么也有一个浅拷贝有意义吗?如果是这样,浅拷贝优于深拷贝的情况是什么?
更新:由于大多数答案和评论都以某种方式解释了什么是浅拷贝,我觉得我必须澄清一下。我确实知道浅拷贝是什么,它是如何工作的,一切。我的问题是,既然我正在开发的是一个库,而且我确实创建了一个深拷贝方法,那么是否也可以提供一个浅拷贝方法?
我还要在这里补充一点,VertexData<T> 中不包含原始类型。类。
因此,在用于存储图库 的顶点数据的容器类的上下文中,是否需要浅拷贝?
如果是这样,你能在我正在开发的内容中想出一个例子吗?
如果不是,我应该只为了完整性而添加浅拷贝方法吗?
这是一个好的做法还是无关紧要?
最佳答案
类似List<Point> 的容器类型可能在某些情况下用于保存一组 X,Y 坐标对,但在其他情况下可能用于识别一组可移动的点,这些点被其他人使用代码。前一种情况可以分割为子情况,其中 List<Point> 的所有者也是Point的独家拥有者其中的实例并可以随意修改它们,或者所有者永远不会修改这些实例但可以与 promise 不修改它们的代码共享对它们的引用。
如果List<Point>用于封装(X,Y)坐标对,但所有者可能会修改Point其中包含的对象,然后是 List<Point> 的适当克隆必须持有对 Point 副本的引用有问题的对象。如果它封装了坐标对,但没有人会修改其中的对象(并且克隆列表的接收者不会将对其中对象的引用公开给可能修改它们的任何代码),然后适当克隆 List<Point>可以保留对原始 Point 的引用元素或其副本;前者会更快,但后者在语义上仍然是正确的。
如果List<Point>用于识别 Point可能被其他代码修改的实例,任何此类修改都需要反射(reflect)在 List<Point> 中本身,那么一个合适的克隆必须持有对相同Point的引用对象作为原始列表。如果一个克隆人持有那些 Point 的副本对象,那么它将不再包含与原始列表相同的语义信息。
如果Java根据它们是使用独占的可变实例还是可共享的不可变实例来封装值,或者它们是否用于识别其中的东西来分离集合类型,那么就有可能有一个单一的“克隆”概念,而不是要求“深”和“浅”克隆。但是,如果集合类型之间没有这种区别,则有必要使用克隆方法来根据集合中的内容执行任何需要的操作。
关于java - 真的需要浅拷贝吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30984836/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候