【问题标题】:will Method chaining create intermediate variable in stack?方法链接会在堆栈中创建中间变量吗?
【发布时间】:2019-01-20 20:15:14
【问题描述】:

方法链:正如概念所述,每个方法返回一个对象,允许 在单个语句中将调用链接在一起。链接是 无需中间变量的语法糖,

只想知道,Method chaining(return a reference to a object) 在stack 中创建(anonymous? )intermediate variables 吗?

在 Java 中

例如a.functionA().functionB().functionC().functionD()

在上面的陈述中,

A.在a 调用functionA 之后,JVM 是否会在stack 中分配一个temporary variable(指向对象B)以便调用下一个函数(如function B)?

B.或者只是variable a(in stack)调用函数functionA,然后returned value(address)(stored somewhere else)heap中指向object B没有中间变量在@中创建987654336@?

在 JavaScript 中

例如: Person 有一个prototype 对象,那么你可以使用prototype 来访问里面的属性,例如sayHi()function 在这种情况下是Person.prototype.sayHi,这会在堆栈中创建一个中间变量吗?

【问题讨论】:

  • @KaustubhKhare,我不认为这个问题回答了这个问题中询问的技术细节。
  • @KaustubhKhare,你能回答我吗?这不是重复的
  • @31piy javascript 中的prototype 怎么样,Person 有一个prototype 对象,那么你可以使用prototype 来访问里面的属性,那么Person.prototype.anything,这会不会在stack 中创建一个中间变量
  • @Ruizhi -- 这个问题没有提到任何与 JavaScript 相关的内容(除了标签)。它在所有地方都引用了 JVM。如果您想要具体答案,请编辑您的问题以限制其范围。
  • @31piy 我已经更新了javascript原型版本

标签: javascript java jvm heap-memory stack-memory


【解决方案1】:

这取决于实现。

但是,在大多数实现中,链接只是更新当前实例并返回其引用,因此不会创建中间变量。

例如:

public class A {
  private int a;
  private int b;

  public A(){}

  public A functionA() {
     return this; // In most implementations, the `this` is returned for chaining
  }

  public A functionB() {
     return this;
  }
}

【讨论】:

  • 返回的引用存储在哪里?在堆或cpu的寄存器中
  • 这只是普通的 Java 对象引用。通常,对象实例在堆上,引用在栈上
  • 我的意思是,在我上面所说的情况下,当a 调用functionAfunctionA 返回一个reference to object B,这就是它可以在Object B 中调用functionB 的原因,我想知道在stack的这个过程中是否有实际的intermediate variablecreated
  • 这取决于您的实现,如果您创建新的则返回新的引用。您控制流程,在这种情况下没有任何隐藏
  • 但是,我没有创建一个新变量来接收返回的地址,只是一个简单的方法链接,a.functionA().functionB().functionC().functionD(),最后一个函数返回一个 void
猜你喜欢
  • 2018-05-04
  • 2017-07-11
  • 2011-04-28
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2014-12-09
相关资源
最近更新 更多