每种IDE都可以帮忙我们Java开发自动生成POJO中的getter和setter,这是因为它们都有各自的生成模版。
强悍的idea也不例外。
下面是idea生成的一个Pojo类:
class T{
private int a;
private Object b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public Object getB() {
return b;
}
public void setB(Object b) {
this.b = b;
}
}
默认情况下,idea的getter都是直接获取属性,setter都是直接赋值。
一些人觉得这样满足不了自己的要求,比如给 String
类型的属性赋值是希望 trim()
一下。所以他们修改了模板,看起来是这样的:
class T {
private String a;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a == null ? null : a.trim();
}
}
我今天要说的是Date类型属性的模板
Date类型有什么特殊呢?
因为Date类不是线程安全的,如果直接设置或者获取,可能会引起意想不到的后果。
我们期望Date类型返回它的副本,所以想生成的POJO类是这样的:
class T {
private Date a;
public Date getA() {
if (a != null) return (Date) a.clone();
return null;
}
public void setA(Date a) {
this.a = a == null ? null : (Date) a.clone();
}
}
怎么配置呢?
假设你知道快捷键是 Alt+insert
,然后选择 getter and setter,进去以后点后面的 ...
:
getter模板配置如下:
#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.date)
if ($field.name != null) return (Date)${field.name}.clone();
return null;
#else
return $field.name;
#end
}
setter模板配置如下:
#set($paramName = $helper.getParamName($field, $project))
#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
#if ($field.date)
$field.name = ${paramName} == null ? null : (Date)${paramName}.clone();
#else
$field.name = $paramName;
#end
}
重点就是其中的 #if ($field.date)
。