如何快速将表达式转换为空检查?

时间:2017-12-14 15:54:24

标签: java eclipse

我正在使用Eclipse。我经常使用java.util.Objects.requireNonNull(T,String)检查not-nullness,并在给定param为null时使用适当的消息抛出异常。

例如,当我在Eclipse的帮助下生成构造函数时:

public Person(String firstName,String lastName){
    this.firstName = firstName;
    this.lastName = lastName;
}

如果参数是强制性的(并非所有参数都是),我想将其更改为更强大的

public Person(String firstName,String lastName){
    this.firstName = requireNonNull(firstName,"firstName is required"); //static import omitted
    this.lastName = requireNonNull(lastName,"lastName is required");
}

目前,我正在使用我的正则表达式找到并替换我手动且小心使用的内容:

 Search: (\w+) (assuming variables do not use underscores)
 Replace: requireNonNull\($1,"$1 is required"\)

手动应用此功能,尤其是在两者末尾都使用分号;,可帮助我转换自动生成的构造函数和设置器。

我的问题是关于升级到更高级别:你知道是否可以通过使用宏或其他东西来减少击键次数或点击次数(如果可能的话,请不要使用自定义插件),以便编辑器选择会转换为requireNonNull调用吗?

E.g。

public Person(String firstName,String lastName){
    this.firstName = __firstName__; //__ means editor highlight
    this.lastName = lastName;
}

变为

import static java.util.Objects.*;

public Person(String firstName,String lastName){
    this.firstName = requireNonNull(firstName,"firstName is required"); 
    this.lastName = lastName;
}

E.g。

public Person(Individual other){ //Individual might carry null values out of my control
    requireNonNull(other);
    this.firstName = __other.getFirstName()__; //__ means editor highlight
    this.lastName = other.getLastName();
}

变为

public Person(Individual other){
    requireNonNull(other);
    this.firstName = requireNonNull(other.getFirstName(),"other.getFirstName() is required"); //I may modify the text later, but this is a good starting point
    this.lastName = other.getLastName();
}

向源文件添加静态导入不是必需的,即我可以使用Favorites让Eclipse在替换文字后为我添加导入

1 个答案:

答案 0 :(得分:2)

您可以使用日食代码模板。转到设置> Java>编辑>模板并为Java上下文创建新模板。取消选中"自动插入"并将以下代码粘贴到Pattern字段中:

${:importStatic('java.util.Objects.requireNonNull')}requireNonNull(${word_selection}, "${word_selection} is required")${cursor}

现在,您可以通过选择要替换的变量来访问代码中的此模板,然后按两次ctrl + space。

旁注:你应该看一下Project Lombok。其中,它引入了一个@NonNull注释,它在编译时自动插入这些nullcheck,所以你可以这样做:

public Person(@NonNull String firstName, @NonNull String lastName){
    this.firstName = firstName;
    this.lastName = lastName;
}