在JCodeModel中实例化字段级HashMap

时间:2017-05-01 19:03:01

标签: jcodemodel

我想在JCodeModel中一次性声明和实例化HashMap。

我做:

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

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

由于

1 个答案:

答案 0 :(得分:2)

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

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

进一步提示:

  • 考虑到您通常应该program to an interface,最好使用“尽可能基本”的类型声明变量。您很难永远将变量声明为

    private HashMap map;
    

    但基本上只是

    private Map map;
    

    因为Map是与此相关的界面。

  • 您还可以在JCodeModel中添加泛型。这些通常涉及某些类型的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>();

}