Создание экземпляра HashMap уровня поля в JCodeModel
Я хочу объявить и создать экземпляр HashMap за один раз в JCodeModel.
Я делаю:
jc.field(JMod.PRIVATE, HashMap.class, "initAttributes");
который заявляет об этом, но не создает его. Как мне это создать?
Спасибо
1 ответ
В простейшем случае вы можете просто добавить инициализацию непосредственно к созданию поля:
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>();
}