当有人说new
关键字有副作用时,有什么意思?在SSE上,给出了答案的评论,但我不理解评论。
显然,问题中的工厂方法称为新的,他们有一面 效果。但是,这种副作用与仅调用a相同 公共构造函数,所以它们并不比测试更难 后者。
问题与使用静态方法构造具有私有构造函数的对象有关。使用new
关键字的副作用是什么?我想如何创建我的对象?
答案 0 :(得分:3)
显然问题调用
new
中的工厂方法,它们有副作用。但是,这种副作用与仅调用公共构造函数相同,因此它们不比后者更难测试。
他说副作用是创造一个新对象;但是在静态工厂方法中调用new
的副作用与直接调用new
没有区别。
答案 1 :(得分:0)
通过“副作用”,程序员通常表示函数本身没有完全包含的任何效果。基本上,如果“世界”因调用函数而发生变化,则会产生副作用。如果您可以根据需要多次调用该函数,并且“世界”不会改变,则不会。但
快速示例:System.out.println("Hello world!");
执行IO,因此它有副作用。 Math.min(5, 10)
只返回5
而不会对任何事情产生任何额外影响,因此它没有任何副作用。
在您的示例中,除了使用new
构造新对象外,您调用的函数似乎并不多。看看这个例子:
static Foo createFoo() {
return new Foo();
}
// ...
while (true) {
createFoo();
}
我们立即看到的明显副作用是内存分配。调用createFoo()
将导致堆内存分配。可以说Math.min(5, 10)
也占用了堆栈上的内存,但是如果你没有自己明确地分配返回值,那么内存消耗是临时的并且完全包含在函数的执行中,在什么时候它是导致内存消耗的调用者。堆分配比函数调用更长,直到它最终被垃圾收集器清理。
我想当你在Java中谈到“没有副作用”时,并不是很清楚,因为几乎所有东西都可以导致堆分配,并且通常在你放弃引用时让对象消失是很好的让GC稍后会清理它。