我正在使用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在替换文字后为我添加导入
答案 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;
}