Создание экземпляра 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>();

}
Другие вопросы по тегам