2013-05-29 35 views
0

我正在使用字节码动态生成java类,然后加载类。我在一个教程中找到了这个代码。了解嵌套集合的困难

private int stringConstant(String s) { 
     return constant(CONSTANT_Utf8, s); 
    } 

    private int classConstant(String s) { 
     int classNameIndex = stringConstant(s.replace('.', '/')); 
     return constant(CONSTANT_Class, classNameIndex); 
    } 

    private int constant(Object... data) { 
     List<?> dataList = Arrays.asList(data); 
     if (poolMap.containsKey(dataList)) 
      return poolMap.get(dataList); 
     poolMap.put(dataList, poolIndex); 
     return poolIndex++; 
    } 

    private void writeConstantPool(DataOutputStream dout) throws IOException { 
     dout.writeShort(poolIndex); 
     int i = 1; 
     for (List<?> data : poolMap.keySet()) { 
      assert(poolMap.get(data).equals(i++)); 
      int tag = (Integer) data.get(0); 
      dout.writeByte(tag);   // u1 tag 
      switch (tag) { 
       case CONSTANT_Utf8: 
        dout.writeUTF((String) data.get(1)); 
        break;    // u2 length + u1 bytes[length] 
       case CONSTANT_Class: 
        dout.writeShort((Integer) data.get(1)); 
        break;    // u2 name_index 
       default: 
        throw new AssertionError(); 
      } 
     } 
    } 

    private final Map<List<?>, Integer> poolMap = 
      new LinkedHashMap<List<?>, Integer>(); 
    private int poolIndex = 1; 

我不明白如何使用包含列表的地图,它似乎不像传统的做这种事情的oop方式。

+0

传统的OOP做什么方式?你会怎么做? –

+1

_“这看起来不像传统的做这种事的办法。” - - 为什么不呢?嵌套列表对象只是用作映射键的对象。什么不是关于它的OOP? –

+0

wouldnt它是更好的只是让一个类代表什么在列表中,并使用它作为密钥 – Popgalop

回答

0

在您给我们的片段中,映射是一种将唯一索引(从1递增)分配给您放入其中的每个列表的方法。这个索引显然是只有assert中用来检查密钥是否按照它们插入的相同顺序检索 - 如果地图是LinkedHashMap,确实应该是这种情况。

就给定的代码而言,LinkedHashSet也可以做到。当然,我们不知道在哪里调用了constant等,也许这些索引被调用者使用。

我从OO的角度看没有反对意见 - 首先关于这个代码片段几乎没有OO。