当前位置: 首页 > 知识库问答 >
问题:

如何创建用于Guava的可选

张俊茂
2023-03-14

我正在尝试使用Intelij模板编写一个自定义setter,但用于Google的Guava Optionals。例如,如果我有一个如下的类:

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

在Android Studio中使用默认的Setter生成输出:

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()以剥离可选的

错误

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

对我该怎么做有什么建议吗?

默认设置生成Setter的默认模板

#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;
}

我的自定义番石榴可选Setter Generation

#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;
}

共有3个答案

阚正真
2023-03-14

Getter,在我的例子中,我需要大写字母的第一个字母并删除字段变量的“m”

#if($field.modifierStatic)
static ##
#end
$field.type ##
#if($field.recordComponent)
  ${field.name}##
#else
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($StringUtil.startsWithIgnoreCase($name, 'm'))
  #set($name = $name.substring(1, $name.length()))
#end
#if ($field.boolean && $field.primitive)
  Is##
#else
  Get##
#end  
${name}##
#end
() {
  return $field.name;
}

如果setter相同,请删除字段变量的“m”,param也会删除它并设置小写首字母

#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
#set($functionName = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($StringUtil.startsWithIgnoreCase($paramName, 'm'))
  #set($paramName = $paramName.substring(1,2).toLowerCase() + $paramName.substring(2, $paramName.length()))
  #set($functionName = $functionName.substring(1)) 
#end
void Set$functionName ($field.type $paramName) {
  #if ($field.name == $paramName)
    #if (!$field.modifierStatic)
      this.##
    #else
      $classname.##
    #end
  #end
  $field.name = $paramName;
}

示例:

private Handler mJobHandler;

吸气剂:

public Handler GetJobHandler()
{
    return mJobHandler;
}

设定器:

public void SetJobHandler(Handler jobHandler)
{
    mJobHandler = jobHandler;
}
虞滨海
2023-03-14

经过一些搜索,我发现在StringUtils中,拆分()的签名与上面发布的不同。

我能够在下面为番石榴Optionals编写一个完整的解决方案来创建setter。它非常脆弱,因为我不熟悉IntelliJ中的模板,因为它依赖于包名。谷歌。常见的基础可选,也可在似乎没有正式记录的字符串上使用。

它首先检查$paramName是否是包装的可选的。如果是这样,请使用番石榴可选设置完成setter。否则,回退到默认的IntelliJ setter。

#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;
}

编辑代码基于@ChiefTwoPencils的反馈。

班昱
2023-03-14

我看到了您的答案,这很好,但您必须知道,您不必为每种需要的类型使用条件来使模板复杂化(即使您现在只有一种,下次呢?)。

相反,为什么不为这个特定的需要创建自己的方法,并选择何时创建这些方法呢?

我会第一个承认这可以做得更好一点;我只是想看看能不能让它正常工作。尽管如此,它并不依赖于完全限定的包名(可选);我甚至没有安装番石榴,而且它很管用。

#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);
}
 类似资料:
  • 问题内容: 我有一个基于Maven的Spring-WS客户端项目,我希望将其打包为一个jar。在日食中,一切正常运行。当我尝试将其打包为可执行jar时,由于Spring jar不包含在我的应用程序jar中,因此出现ClassNotFound异常。 因此,我添加了maven-shade-plugin以将我的所有依赖项都包含在应用程序jar中。当我查看我的应用程序jar时,会看到包含的所有依赖项中的所

  • 我发现自己经常重复的内容。例如,对于典型的应用程序,这将如下所示: 根据执行dockerfile的项目,这里只有三件事是动态的:,,

  • 问题内容: 我正在尝试创建一个以验证以下日期时间: 我已经尝试使用以下日期时间格式化程序来验证上述日期: 它适用于所有上述日期罚款,但根据我的要求就应该失败的。 注意:我知道使用以下格式化程序可以达到预期的结果: 但是我想知道,通过改变我们可以达到预期的结果吗? 为了解析日期,我使用以下方法: 问题答案: 您必须创建一个可选部分(使用和方法),该部分包含小数点后跟1至6位数字: 这将从解析,并引发

  • 我是Docker和Jenkins的新手,我正在尝试创建一个Jenkins管道来构建Docker的形象。我在尝试构建时遇到了问题,并不断收到此错误: /var/jenkins_home/workspace/Docker-Pipeline@tmp/耐用-a11b32f8/脚本。sh:第1行:docker:未找到命令 我已经在虚拟机上安装了ubuntu 我正在做和他完全一样的事情,但总是失败。

  • 我是Android系统的初学者。为了学习,我使用android Studio开发了以下UI。 屏幕上的矩形是一个文本视图,圆形是一个我可以用手绘制的区域。 textview和circle的数量是动态的。

  • 我们有以下架构 SQS(源)->SQS轮询器->我们的业务逻辑->Sink,它从SQS中删除消息。 这是一个akka流(我们的业务逻辑有多个阶段)。 现在我们希望通过添加HTTP服务器(而不是Akka HTTP)来扩展这个体系结构。 现在我们的服务也有了路径 我认为https://doc.akka.io/docs/akka/2.5/stream/operators/source/queue.htm