新关键字的副作用

时间:2017-10-23 11:22:47

标签: java oop keyword

当有人说new关键字有副作用时,有什么意思?在SSE上,给出了答案的评论,但我不理解评论。

  显然,问题中的工厂方法称为新的,他们有一面   效果。但是,这种副作用与仅调用a相同   公共构造函数,所以它们并不比测试更难   后者。

问题与使用静态方法构造具有私有构造函数的对象有关。使用new关键字的副作用是什么?我想如何创建我的对象?

2 个答案:

答案 0 :(得分:3)

full comment是:

  

显然问题调用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稍后会清理它。