Я пытаюсь написать настраиваемый сеттер с использованием шаблонов Intellij, но для опций Google Guava. Например, если у меня есть следующий класс:

public class Note {
    public Optional<String> title;
}

Использование генерации по умолчанию Setter в выходных данных Android Studio:

public class Note {
    public Optional<String> title;

    public void setTitle(Optional<String> title) {
        this.title = title;
    } 
}

Я хочу добиться:

public class Note {
    public Optional<String> title;

    public void setTitle(String title) {
        this.title = Optional.fromNullable(title);
    } 
}

Что я пробовал до сих пор, так это копирование шаблона Intelij и использование StringUtil.split() для удаления части Optional< сигнатуры метода. Однако я получаю сообщение об ошибке при использовании шаблона ниже.

Ошибка

Incorrect method 'public void setTitle($StringUtil.split($field.type, true, "<").get(1) title) { mTitle = title; }

Есть какой-нибудь совет, что мне делать?

Шаблон по умолчанию Intelij Default для генерации сеттера

#set($paramName = $helper.getParamName($field, $project))
public ##
#if($field.modifierStatic)
  static ##
#end
void set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($field.type $paramName) {
  #if ($field.name == $paramName)
    #if (!$field.modifierStatic)
      this.##
    #else
      $classname.##
    #end
  #end
  $field.name = $paramName;
}

Моя кастомная генерация опционального сеттера Guava

#set($paramName = $helper.getParamName($field, $project))
public ##
#if($field.modifierStatic)
  static ##
#end
void set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($StringUtil.split($field.type, true, "<").get(1) $paramName) {
  #if ($field.name == $paramName)
    #if (!$field.modifierStatic)
      this.##
    #else
      $classname.##
    #end
  #end
  $field.name = $paramName;
}
5
AeroEchelon 21 Фев 2016 в 01:59

2 ответа

Лучший ответ

После некоторого поиска я обнаружил, что в StringUtils, split() имел подпись, отличную от указанной выше.

Я смог написать полное решение для создания установщика для Guava Optionals ниже. Это довольно хрупко, поскольку я новичок в шаблонах в IntelliJ, поскольку он полагается на имя пакета com.google.common.base.Optional, а также на {{X1} }, что, похоже, официально не задокументировано.

Сначала он проверяет, является ли $paramName обернутым Optional. Если да, дополните сеттер необязательной настройкой Guava. В противном случае вернитесь к установщику IntelliJ по умолчанию.

#set($paramName = $helper.getParamName($field, $project))
public ##
#if($field.modifierStatic)
    static ##
#end
#if($StringUtil.split($field.type, "<").get(0).equals("com.google.common.base.Optional"))    
    #set($paramSignature = $StringUtil.trimEnd($StringUtil.substringAfter($field.type, "<"), ">"))
    #set($fieldAssignment = "Optional.fromNullable(" + $paramName + ")") 
#else
    #set($paramSignature = $field.type)
    #set($fieldAssignment = $paramName)
#end
void set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($paramSignature $paramName) { 
#if ($field.name == $paramName)
    #if (!$field.modifierStatic)
        this.##
    #else
        $classname.##
    #end
#end
$field.name = $fieldAssignment;
}

EDITED . Код основан на отзывах @ChiefTwoPencils.

3
AeroEchelon 21 Фев 2016 в 08:40

Я вижу ваш ответ, и это приятно, но вы должны знать, что вам не нужно усложнять шаблон условными выражениями для каждого типа, который вам нужен (даже если у вас есть только один сейчас; что насчет следующего раза?).

Вместо этого, почему бы не создать свой собственный для этой конкретной потребности и выбрать, когда вы будете создавать методы?

Я буду первым, кто признает, что это можно было бы сделать немного лучше; Я просто пытался понять, смогу ли я заставить его работать правильно. Тем не менее, это не зависит от полного имени пакета Optional; У меня даже Guava не установлен, и он работает.

#set($paramName = $helper.getParamName($field, $project))
public ##
#if($field.modifierStatic)
  static ##
#end
void set$StringUtil.capitalizeWithJavaBeanConvention(
  $StringUtil.sanitizeJavaIdentifier(
    $helper.getPropertyName($field, $project)
  )
)($StringUtil.trimEnd($StringUtil.substringAfter($field.type, "<"), ">") $paramName) {
  #if ($field.name == $paramName)
    #if (!$field.modifierStatic)
      this.##
    #else
      $classname.##
    #end
  #end
  $field.name = Optional.fromNullable($paramName);
}
3
ChiefTwoPencils 21 Фев 2016 в 00:51