我想知道昨天有什么东西跳进了我的脑海。
我提前为这个误导性的标题道歉,但我真的不知道如何获得这个权利。
好吧,假设我们是两个对象ObjA
和ObjB
,例如,ObjB
有一个方法,它将ObjA
个对象作为参数。
我们可以这样做(以java为语言):
ObjA instanceA = new ObjA();
ObjB instanceB = new ObjB();
instanceB.method(instanceA);
或
new ObjB().method(new ObjA());
假设这是某个函数的主体,因此当超出范围时,对象将被销毁。
我的问题是:
通过不实例化单个对象并隐式调用第二个代码,我们是否获得了性能优势?
这种可读性牺牲是否值得?
或者它是否一无所获,因为隐式创建的对象将存储在内存中并且仍然按范围死亡?
注意:我不知道我是说“隐含”还是“匿名”,但我在谷歌上找不到多少。
答案 0 :(得分:6)
绝对没有性能差异。
但在少数情况下,您将被迫使用第一种类型。
例如:
WARNING in ./js/pedigree.js
32:35-49 "export 'default' (imported as 'DisorderLegend') was not found in './disorderLegend'
ERROR in ./js/pedigree.js
Module not found: Error: Can't resolve './OkCancelDialogue' in '/home/tim/workspace/projects/public/js/ext-lib/panogram/js'
@ ./js/pedigree.js 5:0-54
@ ./js/viewerPedigree.js
@ ./main.js
@ multi (webpack)-dev-server/client?http://localhost:8080 ./main.js
webpack: Failed to compile.
如果你在中间没什么可做的,我可以用第二种方法来保存一行代码。
答案 1 :(得分:2)
在这种情况下,可读性是这种或那种方式的唯一优势。
没有显着性能或内存优势。如果您将引用存储在本地变量中然后调用该方法,则存储的极小性能可能会受到影响参考资料。
创建匿名对象并立即死亡。但是,仍然使用匿名对象可以在使用匿名对象调用方法之前提取工作:
new ObjB().method(new ObjA());
我们不能使用两次或更多,因为匿名对象在完成其分配的任务后立即死亡。
答案 2 :(得分:1)
如果您需要存储对象以多次使用它而不创建新对象,或者存储某些方法的当前结果(如果存在风险,则返回对象),则需要使用命名变量的第一种方法(例如,因为多线程)下次结果会有所不同。在其他情况下,使用匿名对象更方便,因为它们的范围相同,并且没有使用不需要的标识符混淆命名空间。