这个骨架实现如何工作

时间:2010-12-13 07:14:00

标签: java

这个程序来自有效的java第2版书籍,我无法理解int []如何转换为List。有人可以帮我解释一下吗。 包装示例。第4章。项目18;

// Concrete implementation built atop skeletal implementation - Page 95


import java.util.*;



public class IntArrays {

static List<Integer> intArrayAsList(final int[] a) { 
            if (a == null)
         throw new NullPointerException();

 return new AbstractList<Integer>() {
     public Integer get(int i) {
  return a[i]; // Autoboxing (Item 5)
     }

     @Override
     public Integer set(int i, Integer val) {
  int oldVal = a[i];
  a[i] = val; // Auto-unboxing
  return oldVal; // Autoboxing
     }

     public int size() {
  return a.length;
     }
 };
    }

    public static void main(String[] args) {
 int[] a = new int[10];
 for (int i = 0; i < a.length; i++)
     a[i] = i;
 List<Integer> list = intArrayAsList(a);

 Collections.shuffle(list);
 System.out.println(list);
    }
}

2 个答案:

答案 0 :(得分:2)

该示例提供了一种将原始int数组快速包装为LIst of Integers的方法。在内部,它使用自动装箱在int和Integer之间进行转换。该技术可能很有用,因为int []和List之间没有类似的转换。

基本技术是构建AbstractList的匿名实现。

public class IntArrays {

     static List<Integer> intArrayAsList(final int[] a) { 
     if (a == null)
         throw new NullPointerException();


     return new AbstractList<Integer>() {
         // code here
     }
}

诀窍是 final int [] a 可用于实现方法。

之后我们只需要提供 AbstractList 定义的接口的实现方法,即方法get(),set()和size()。

所以每个都非常明显,充分利用了自动装箱。

 public Integer get(int i) {
          return a[i]; // Autoboxing (Item 5)
 }


 public Integer set(int i, Integer val) {
       int oldVal = a[i];
       a[i] = val; // Auto-unboxing
       return oldVal; // Autoboxing
 }

 public int size() {
     return a.length;
 }

答案 1 :(得分:2)

此博客文章详细讨论了骨架实现:1