Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优雅与效率| java_Java_Garbage Collection_Performance - Fatal编程技术网

优雅与效率| java

优雅与效率| java,java,garbage-collection,performance,Java,Garbage Collection,Performance,我是Java新手,我想知道什么是更好的和传统的编程 当我要更改现有对象的属性时: 一种方法是通过set函数简单地设置值,似乎更有效: anExistVar.setX(newValue); anExistVar.setY(2); anExistVar.setSomething(null); 另一种方法是创建一个新对象(在重写中),看起来更优雅、更清晰(将一些工作留给垃圾收集器……): 也许答案取决于我需要更改的值的数量? 也许在这种情况下没有显著的效率差异 (我的问题是指JAVA或系统管理动态内

我是Java新手,我想知道什么是更好的传统的编程

当我要更改现有对象的属性时:

一种方法是通过
set
函数简单地设置值,似乎更有效:

anExistVar.setX(newValue);
anExistVar.setY(2);
anExistVar.setSomething(null);
另一种方法是创建一个新对象(在重写中),看起来更优雅、更清晰(将一些工作留给垃圾收集器……):

也许答案取决于我需要更改的值的数量? 也许在这种情况下没有显著的效率差异

(我的问题是指JAVA或系统管理动态内存的任何语言)

我读了一些关于这个问题的讨论,但没有得到明确的答案


提前谢谢

第二种方法允许您使用不可变对象,这有一些优点。例如,由于不可变对象无法更改,因此您永远不必复制它们:在某些情况下,这可能更有效。这使得您可以在每次需要更改值时创建一个新对象,但是gc可以有效地收集生命周期较短的对象


请注意,有些语言,如Haskell,只有不可变的OJBECT。

一般来说,在六个月后做最有意义的事情。Java针对垃圾收集新创建的对象进行了优化,因此在效率方面也没有太多问题。

这不取决于您想要什么吗?第一个片段修改现有对象,而第二个片段创建新对象。对同一对象的引用将在版本1中看到新值,但在版本2中不会看到

当它只是一个引用时:第一个引用更详细,因此可能更容易理解。而且,构造器应该只带必要的东西。(如果没有这一点,该对象将毫无用处)
过多的重载构造函数也容易造成混淆。我认为最好把每个赋值都明确地写出来。

如果您不需要带有旧属性值的旧oblect,请更改它。传统就是改变它。否则评论员会追问你为什么这么做。 我想知道现在在哪里使用旧物体。使代码更清晰更重要


内存和垃圾收集器暂停是一个问题,如果在许多地方、许多请求或循环中都是这样的话。简言之,如果功能允许,请更改原始文件

我认为答案取决于您在这里实际要做什么。从概念上讲,最基本的问题是,在更新其成员或将其完全重新分配为程序中的一个全新实体后,程序员是否会考虑
anExistVar
的状态?或者它仅仅是旧事物的一个修改版本

如果只是一个修改版本,为什么要同时更新所有成员变量?旧对象和新对象共享相同的名称和内存位置,但逻辑上它们之间似乎没有任何关系。但是,请注意,如果您打算更新所有成员变量,但未能更新,您可能会认为旧状态和新状态之间没有关系,因此无法意识到旧状态存在一些延迟。特别是,可能有一些私有成员变量没有相应的public
set
方法,因此,即使您有意这样做,也可能无法完全转换对象。简而言之,这种对对象的根本性转换是令人困惑的,因为它无法立即弄清楚你在做什么,为什么,或者你是否真的会成功。但是,如果您认为修改后的对象本质上仍然是相同的对象(例如,使用一些原始数据),那么修改现有对象比创建部分忠实的副本更有意义

如果您正在创建一些全新的东西,那么最好将其声明为
new
对象。如果希望旧对象和新对象之间存在某种关系,可以使用多种技术,例如
静态
类成员来跟踪已实例化该类的实例总数。或者,如果希望新实例的构造部分由旧实例的公共属性决定,则显式地将这些属性传递给构造函数


就效率和垃圾收集器而言,可能没有理由担心这两种情况。垃圾收集器的作用是减轻程序员显式删除内容的负担;你不能明确地控制它的行为,而且它的行为非常有效,你真的不必担心它。内存不足比使垃圾收集器负担过重更令人担忧。在您描述的特定情况下,是的,垃圾收集器将需要删除旧对象,但这不会对收集器的效率产生重大影响。维护对不再需要的对象的引用是有问题的,因为垃圾收集器将无法收集这些对象,以防您以后引用它们;因为这不是您在这里要做的,所以从编程和逻辑的角度来看,最好只做最清晰的

我认为答案可能取决于流程的目的。我个人不会重新实例化,除非上下文发生变化。这就是OOP的目的:您正在使用一个对象,只要您继续使用它,您就可以通过
getters
setters
处理它的属性,但是当您更改为使用另一个对象时,您就可以重新实例化它。以面试个人为例。你可以谈论和记录他的年龄、爱好、地址等。你不知道
anExistVar = new SomeClass(newValue, 2, null);