Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Keyword - Fatal编程技术网

Java 新关键字的副作用

Java 新关键字的副作用,java,oop,keyword,Java,Oop,Keyword,当某人说new关键字有副作用时,是什么意思?在上,有人对答案发表了评论,但我不理解这些评论 很明显,问题中的工厂方法是新的,它们有其一面 影响。然而,这种副作用与仅仅调用 公共构造函数,因此它们与 后者 这个问题与使用静态方法构造带有私有构造函数的对象有关。使用new关键字有什么副作用?我该如何创建我的对象 显然,问题调用new中的工厂方法有副作用。然而,这种副作用与仅仅调用公共构造函数是相同的,因此它们并不比后者更难测试 他说副作用是创造了一个新的物体;但是在静态工厂方法中调用new的副作用

当某人说
new
关键字有副作用时,是什么意思?在上,有人对答案发表了评论,但我不理解这些评论

很明显,问题中的工厂方法是新的,它们有其一面 影响。然而,这种副作用与仅仅调用 公共构造函数,因此它们与 后者

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

显然,问题调用
new
中的工厂方法有副作用。然而,这种副作用与仅仅调用公共构造函数是相同的,因此它们并不比后者更难测试

他说副作用是创造了一个新的物体;但是在静态工厂方法中调用
new
的副作用与直接调用
new
没有什么区别。

所谓“副作用”,程序员通常指的是函数本身没有完全包含的任何影响。基本上,如果“世界”因调用某个函数而发生变化,则会产生副作用。如果你可以任意多次调用这个函数,而“世界”永远不会改变,它也不会改变

快速示例:
System.out.println(“helloworld!”)不执行IO,因此有副作用
Math.min(5,10)
只返回
5
,对任何东西都没有任何额外影响,因此它没有副作用

在您的示例中,您调用的函数除了使用
new
构造一个新对象之外似乎没有什么作用。看看这个例子:

static Foo createFoo() {
    return new Foo();
}
// ...
while (true) {
    createFoo();
}
我们马上看到的明显的副作用是内存分配。调用
createFoo()
将导致堆内存分配。可以说,
Math.min(5,10)
也会消耗堆栈上的内存,但是如果您自己没有显式地分配返回值,那么内存消耗是临时的,并且完全包含在函数的执行中,此时是调用方导致内存消耗。堆分配比函数调用更有效,直到它最终被垃圾收集器清除


我想在爪哇,你可以说“没有副作用”,因为几乎所有的东西都能导致堆分配,这是不明确的。当你放下参考文献,让GC在稍后清理它时,通常会很好地考虑到对象的消失。

副作用是创造新的对象,不是吗?就像戴维已经提到的那样。“副作用等同于只调用公共构造函数“实际上,你必须在你的代码中的某个地方使用
new
,无论是直接使用还是通过某种方法。这些方法可能有副作用,因此可能更难测试,但这并不意味着你不应该使用它们。有人可能会说工厂方法不应该是静态的,因为它们不能被重写,因此很容易被模拟/测试。@AndyTurner-对我来说,这听起来好像有问题。当有人说“副作用”时,听起来像是你在说,要当心某些东西problems@S.R.您可能不想关心真正创建了
武器
的哪个子类,所以您让一个工厂方法为您创建它(它也使用
new
)。您还可以使用依赖项注入并注入实例,而不是自己创建实例。你也可以使用创建实例。对我来说,我就像有人在服药一样服用,小心副作用…等等哈!。我以为
new
关键字在创建
对象时出了问题,请使用
new
,但要小心一些问题。@S.R.a是计算机科学中的一个特定术语,它不一定是负面的。@S.R.副作用只是一个问题,如果你没有预料到它和/或它不是你想要的(如果你不期望它,你就不知道它是否是你想要的!)在这种情况下,你想要一个新的对象,所以它绝对是你想要的。