2017-05-01 6 views
0

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))); 

일부 추가 힌트 :

감사

간단한 경우

답변

0

, 당신은 단지 자신 필드 생성에 직접 초기화를 추가 할 수 있습니다

  • 고려 당신이해야 일반적으로 program to an interface 인 경우 "가능한 한 기본"유형을 사용하여 변수를 선언하는 것이 좋습니다. 당신은 거의

    private HashMap map; 
    

    로 변수를 선언해서는 안하지만, 기본적으로 항상에만

    private Map map; 
    

    Map 때문에 여기에 관련되는 인터페이스입니다.

  • 제네릭을 JCodeModel에 추가 할 수도 있습니다. 일반적으로 특정 유형의 전화는 narrow입니다. 좀 더 노력하지만 원시 형식으로 인해 경고가 발생하지 않고 컴파일 할 수있는 코드가 생성됩니다.

예가 여기에 나와 있습니다. (이 맵의 값 형으로 키 유형 및 Integer으로 String 사용 그에 따라이를 조정할 수 있습니다.) 다음과 같이 생성 된 클래스 보이는

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>(); 

}