java - 匿名类实例中的最终参数存储在哪里?

标签 java parameters adapter final anonymous-class

我有以下从 int 数组创建 ListView 的静态工厂方法:

public static List<Integer> newInstance(final int[] numbers) {
    return new AbstractList<Integer>() {

        @Override
        public Integer get(int index) {
            return numbers[index];
        }

        @Override
        public int size() {
            return numbers.length;
        }
    };
}


public static void main(String[] args) {
    int[] sequence = {10, 20, 30};
    List<Integer> list = ListFactory.newInstance(sequence);
    System.out.println("List is "+list);

}

在《Effective Java》中,Joshua Bloch 提到了这一点

as an Adapter that allows an int array to be viewed as a list of Integer instances.

但是,我记得 Adapter 使用组合,匿名列表实现的实例应该使用 int[] 作为成员字段。

如果 int[] 输入参数不是匿名列表实现的成员字段,它究竟存储在哪里?

如果有人能提供一些见解或一些链接以查找更多信息,我将不胜感激。

最佳答案

您可以使用 javac -d 。 -XD-printflat ListFactory.java 看看编译器是如何理解内部类的。实际上,您的示例中有两个 Java 类。 ListFactory(注意 numbers 是如何传递给 ListFactory$1 的构造函数的):

public class ListFactory {

    public ListFactory() {
        super();
    }

    public static List newInstance(final int[] numbers) {
        return new ListFactory$1(numbers);
    }
}

以及AbstractList的匿名实现的表示:

class ListFactory$1 extends AbstractList {
    /*synthetic*/ final int[] val$numbers;

    ListFactory$1(/*synthetic*/ final int[] val$numbers) {
        this.val$numbers = val$numbers;
        super();
    }

    @Override()
    public Integer get(int index) {
        return Integer.valueOf(val$numbers[index]);
    }

    @Override()
    public int size() {
        return val$numbers.length;
    }

    @Override()
    /*synthetic*/ public Object get(/*synthetic*/ int index) {
        return this.get(index);
    }
}

标记为合成的方法和字段由编译器生成,作为程序员您无法访问,但在运行时用于访问 int 数组。确实有一个 val$numbers 字段保存对 int 数组的最终引用。

顺便说一句,您还可以注意到 Integer get(int index) 中从 intInteger 的装箱,并且符合原始格式(非泛型)List 接口(interface)生成一个额外的 Object get(int index) 方法,该方法委托(delegate)给类型安全的 Integer get(int index) 实现。

关于java - 匿名类实例中的最终参数存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34290420/

相关文章:

java - 这个递归函数如何得到这个输出?

java - 合并错误消息以进行多字段验证

java - 是否可以在 Java 中创建一个对输入法进行计时的方法?

ruby-on-rails - 参数数量错误 [ex :(3 for 2)] in methods [but only pass 2]

c# - C#中使用MSV2008更改虚方法签名时,如何自动更改重写方法的签名?

java - 计数文章 "a","an"在文本文件中被使用的次数

c# - 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

java - Gson 会忽略 JsonElement 字段上的 @JsonAdapter 吗?

adapter - Plone 人 4 : How to customize a method in Archetypes content types?

javascript - 在 MobileFirst javascript 适配器中使用 xml 输入调用 DB 存储过程