2017-11-08 21 views
3

Intellij IDEでは、コードを生成するための独自のテンプレートを書き込むことができます。私はと同等のメソッドを生成するテンプレートをwritteしたいと思います。私はこれが等しいで書かたい
(apache.commons.languageからStringUtils.IsNotEmptyを使用して)Intellijテンプレートジェネレータの構文

public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    POJO pojo = (POJO) o; 

    if(StringUtils.IsNotEmpty(stringAtt) ? !stringAtt.equals(pojo.stringAtt) : StringUtils.IsNotEmpty(pojo.stringAtt)) return false; 

    return true;  
} 

: 目標はヌルと、このような空の文字列の間distiguishいないequalsメソッドを持つことです私が使用しているすべてのPOJOのコードを生成することができます。

問題は、intellijテンプレートの生成に使用される言語とトークンの構文を完全に理解できていないことです。

#parse("equalsHelper.vm") 
public boolean equals(## 
#if ($settings.generateFinalParameters) 
    final ## 
#end 
Object $paramName){ 
#addEqualsPrologue() 
#if ($fields.size() > 0) 
    #addClassInstance() 
#foreach($field in $fields)  
    #addFieldComparison($field) 
#end 
#end 

return true; 
} 
## 
#macro(addFieldComparison $field) 
    #if ($field.notNull) 
    if(!${field.accessor}.equals(${classInstanceName}.$field.accessor))return false; 
    #else 
    if($field.accessor != null ? !${field.accessor}.equals(${classInstanceName}.$field.accessor) : ${classInstanceName}.$field.accessor != null)return false; 
    #end 
#end 
## 

私はIntellijのドキュメントページでそれを探しましたが、その構文についての説明は見つかりませんでした。

  • 誰かが私に良い例を示したり、ドキュメンテーションWebページを指しているので、私はそれを行う方法を学ぶことができますか?
  • それともこれはので、私は自分自身

おかげでそれを学ぶことができているどの言語。

+0

良い質問。ここをクリックしてください:https://www.jetbrains.com/help/idea/file-and-code-templates.html –

+0

ありがとうございます@TimBiegeleisen、私はドキュメントでそれを逃した。言語はVTL – alvaro

答えて

2

だから、これのために使用される言語は、私が仕事をしていると思いますVelocity Template LanguageまたはVTL

です。唯一重要なことは、POJOのフィールドが文字列かどうかをチェックすることでした。次に、コードが書き込まれている場合、コードは前方に向かっています。これは私の答えです。私はそれが助けてくれることを願っています。私はaddFieldComparissonマクロのコードを与えているだけです。残りは同じです。

#macro(addFieldComparison $field) 
    ## Check if the field is a String 
    // CHECKED TYPE: ${field.accessor.class.name} 
    #if (${field.accessor.class.name} == "java.lang.String") 
    //is a String 
    if(StringUtils.isNotEmpty($field.accessor) ? !${field.accessor}.equals(${classInstanceName}.$field.accessor) : StringUtils.isNotEmpty(${classInstanceName}.$field.accessor))return false; 
    #else 
    // Not a String 
    if($field.accessor != null ? !${field.accessor}.equals(${classInstanceName}.$field.accessor) : ${classInstanceName}.$field.accessor != null)return false; 
    #end 
#end 
+0

です。Intellij Community 2017.2.5では正しく動作しません。すべてのオブジェクトは文字列として扱われます。つまり、$ {field.accessor.class.name}はすべてのフィールドでjava.lang.Stringを返しています。他の種類のオブジェクトがJava.Util.Dateなどのメソッドに渡されていることを二重に確認しました。私はIDEのバグだと思う。誰もがこれを知っていますか? – alvaro

関連する問題