java - 如何使用 JDK8 可选为可空字段创建自定义 IntelliJ getter 模板

标签 java templates intellij-idea velocity

我正在尝试创建一个使用 JDK8 Optional 的自定义 IntelliJ 模板。如果一个字段被注释为 @Nullable我想使用 Optional 作为 getter。

而不是这个(使用默认的 getter 模板):

@Nullable
private final String name;

public String getName() {
    return name;
}

我想要这个:

@Nullable
private final String name;

public java.util.Optional<String> getName() {
    return java.util.Optional.ofNullable(name);
}

我保留了完整的包名,因为 IDE 会希望导入正确的 Optional(而不是 Guava 的)。

这是我到目前为止的内容:

#if($field.modifierStatic)
static ##
#end
$field.type ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.primitive)
  is##
#else
  get##
#end
${name}() {
  #if ($field.getAnnotation(javax.annotation.Nullable.class))
    return Optional.ofNullable($field.name);
  #else  
    return $field.name;
  #end  
}

getAnnotation(javax.annotation.Nullable.class)似乎不起作用。还缺少使用 Optional<String>而不是 String .

我正在使用 javax.annotation.Nullable注释,但理想情况下它可以与任何配置的注释一起使用:

enter image description here

最佳答案

我就是这样配置的。我有一个名为 Optional getter 的 getter 模板:

#if($field.modifierStatic)
static ##
#end
Optional<$field.type> ##
#if($field.recordComponent)
  ${field.name}##
#else
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.primitive)
  is##
#else
  get##
#end
${name}##
#end
() {
  return Optional.ofNullable($field.name);
}

我通常使用 Lombok 作为 getter,这就是为什么我可以一直选择该模板的原因。下面是在 Generate... -> Getter 上弹出的窗口:

enter image description here

当我选择了这个之后,我就可以开始输入 getSomething... 然后会出现一个弹出窗口:

enter image description here

点击输入后插入以下代码:

enter image description here

关于java - 如何使用 JDK8 可选为可空字段创建自定义 IntelliJ getter 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46404047/

相关文章:

c++ - C++ 中 <type*[n]> 和 <type(*)[n]> 的区别

java - IntelliJ IDEA 对 Spring Boot 项目的持久化支持

java - Intellij IDEA 中的 Tomcat 错误

java - 抽象类是否应该有一个 serialVersionUID

c++ - 表达式 std::enable_if 中的 type* 是什么

java - Java 项目中的类路径问题

c++ - 递归模板 - 常量 n 大小数组 -> n-1 大小就地?

Android Studio 查看更改应用于哪些文件

java - 将 JSON 作为字符串存储在 DynamoDB 与列表/ map 类型中

java - 从 Java 执行包含 while 循环的 shell 脚本