我想在 JCodeModel 中一次性声明和实例化一个 HashMap。
我愿意:
jc.field(JMod.PRIVATE, HashMap.class, "initAttributes");
声明它但不实例化它。我如何实例化它?
谢谢
我想在 JCodeModel 中一次性声明和实例化一个 HashMap。
我愿意:
jc.field(JMod.PRIVATE, HashMap.class, "initAttributes");
声明它但不实例化它。我如何实例化它?
谢谢
在最简单的情况下,您可以将初始化直接附加到您创建的字段中:
jc.field(JMod.PRIVATE, HashMap.class, "initAttributes")
.init(JExpr._new(codeModel.ref(HashMap.class)));
一些进一步的提示:
考虑到您通常应该对接口进行编程,因此最好使用“尽可能基本”的类型来声明变量。您几乎不应该将变量声明为
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>();
}