实例化JCodeModel中的字段级别hashmap



我想在jcodemodel中声明并实例化hashmap。

我做:

jc.field(JMod.PRIVATE, HashMap.class, "initAttributes");

声明它但没有实例化。我如何实例化?

谢谢

在最简单的情况下,您可以将初始化直接附加到您的字段创建中:

jc.field(JMod.PRIVATE, HashMap.class, "initAttributes")
    .init(JExpr._new(codeModel.ref(HashMap.class)));

其他一些提示:

  • 考虑到您通常应该将其编程到接口,因此最好使用"尽可能基本的"类型来声明变量。您几乎不应该 ever 将变量声明为

    private HashMap map;
    

    ,但基本上总是只有

    private Map map;
    

    因为Map是此处相关的接口。

  • 您也可以在JCodeModel中添加 generics 。这些通常涉及到某些类型的narrow的一些调用。这是更多的努力,但是它将生成可以编译的代码,而不会因原始类型而引起警告。

此处显示一个示例。(它将String用作密钥类型,将Integer用作地图的值类型。您可以相应地调整此功能(

import java.util.HashMap;
import java.util.Map;
import com.sun.codemodel.CodeWriter;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JMod;
import com.sun.codemodel.writer.SingleStreamCodeWriter;
public class InitializeFieldInCodeModel
{
    public static void main(String[] args) throws Exception
    {
        JCodeModel codeModel = new JCodeModel();
        JDefinedClass definedClass = codeModel._class("com.example.Example");
        JClass keyType = codeModel.ref(String.class);
        JClass valueType = codeModel.ref(Integer.class);
        JClass mapClass = 
            codeModel.ref(Map.class).narrow(keyType, valueType);
        JClass hashMapClass =
            codeModel.ref(HashMap.class).narrow(keyType, valueType);
        definedClass.field(JMod.PRIVATE, mapClass, "initAttributes")
            .init(JExpr._new(hashMapClass));
        CodeWriter codeWriter = new SingleStreamCodeWriter(System.out);
        codeModel.build(codeWriter);
    }
}

生成的类看起来如下:

package com.example;
import java.util.HashMap;
import java.util.Map;
public class Example {
    private Map<String, Integer> initAttributes = new HashMap<String, Integer>();
}

最新更新