我有以下从 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)
中从 int
到 Integer
的装箱,并且符合原始格式(非泛型)List
接口(interface)生成一个额外的 Object get(int index)
方法,该方法委托(delegate)给类型安全的 Integer get(int index)
实现。
关于java - 匿名类实例中的最终参数存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34290420/