【问题标题】:Returning an anonymous class that uses a final primitive. How does it work?返回使用最终原语的匿名类。它是如何工作的?
【发布时间】:2010-04-23 14:23:42
【问题描述】:

我想知道是否有人可以解释以下代码的工作原理:

public interface Result {
  public int getCount();
  public List<Thing> getThings();
}


class SomeClass {
...
  public Result getThingResult() {
    final List<Thing> things = .. populated from something.

    final int count = 5;

    return new Result {
      @Override
      public int getCount() {
        return count;
      }

      @Override
      public List<Thing> getThings();
        return things;
      }
    }
  }
...
}

原始 int 、 List 引用和 List 实例存储在内存中的什么位置?它不能在堆栈上.. 那么在哪里? 在这种情况下,引用和原语的处理方式有区别吗?

非常感谢, 蒂姆·P.

【问题讨论】:

  • 您想解释一下这是针对哪种语言、操作系统和实现的吗?然后您可以将信息放入标签中,或者我可以。现在,您是在问一个具体的问题,但不限于知道答案的人。
  • @JRL,这不会解释它是如何在 Java 中实现的。
  • 对不起,stackoverflow 上的第一篇文章。

标签: java return-value primitive anonymous-class


【解决方案1】:

使用的最终局部变量(以及任何外部this 引用)在构造过程中被复制到内部类的合成字段中。与往常一样,引用和原语的处理方式相同。两者都是(浅)复制的。

您可以使用 JDK 中的javap 来查看正在生成的内容。

【讨论】:

  • ...这就是为什么它们必须是最终的:这样就没有人知道变量只是被复制了。
  • @Michael 当然,可以悄悄地进行额外分配以在堆上存储可变状态。
  • @Michael:您可以通过使用数组(或任何其他容器;Holder 可以很好地工作)来破解最终确定性。凌乱,但有效。
  • 感谢 Tom、Micheal 和 Donal,这解释得很清楚。有时间我会看看javap。使用 Apaches Mutable... 类在这里帮助了我。
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多