问题描述
根据java中的命名习惯,我们经常会在成员变量名称的前面加个m,比如mBody,mContext,mText等等。有时我们需要写一个get、set方法。那么根据Android studio提供的版本很容易写出如下代码
会出现如下代码:
package wzk.com.slidecloseactivity;
/**
* @author WangZhengkui on 2016-02-24 12:17
*/
public class Test {
String mText;
String mContext;
public String getmText() {
return mText;
}
public void setmText(String mText) {
this.mText = mText;
}
public String getmContext() {
return mContext;
}
public void setmContext(String mContext) {
this.mContext = mContext;
}
}
可以看到getmContext,setmContext等方法名,而这种命名方法不符合java命名规范。
解决方案
在上面第二张图片时点击右边的省略号,可以看到生成的上述代码的源代码
public ##
#if($field.modifierStatic)
static ##
#end
$field.type ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.primitive)
#if ($StringUtil.startsWithIgnoreCase($name, 'is'))
#set($name = $StringUtil.decapitalize($name))
#else
is##
#end
#else
get##
#end
${name}() {
return $field.name;
}
虽然不懂这种语法,不过根据生成的代码,我们可以读懂它。
‘##’代表的是连字符
‘#’ 表示的是关键字
‘$’表示的是引用
$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
helper.getPropertyName(
field, $project)是获取我们的变量名,
然后再调用StringUtil中的capitalizeWithJavaBeanConvention()、sanitizeJavaIdentifier()方法获取返回值
StringUtil的源码在http://grepcode.com/file/repository.grepcode.com/java/ext/com.jetbrains/intellij-idea/12.0/com/intellij/openapi/util/text/StringUtil.java这个链接里。
从这里我们知道capitalizeWithJavaBeanConvention()是将变量名的第一个字母大写。
改写步骤
读懂了代码,我们就开始改写。我们的目的是将getmContext()改成getContext()。那我们就需要将m字母去掉。
1、首先点击+号,新建一个模板,命名为remove_m
2、在新模板里将
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
这段代码改成:
#if ($StringUtil.startsWith($helper.getPropertyName($field, $project),"m"))
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($StringUtil.substringAfter($helper.getPropertyName($field, $project),"m"))))
#else
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#end
新添加的代码的意思是如果发现变量名是以”m”开头,则将其移除($StringUtil.substringAfter())。
相应的在Setters模板里,点击+号,新建模板,然后将新模板里的
void set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($field.type $paramName)
改成
#if ($StringUtil.startsWith($helper.getPropertyName($field, $project),"m"))
set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($StringUtil.substringAfter($helper.getPropertyName($field, $project),"m")))($field.type $paramName)
#else
set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($field.type $paramName)
#end
请注意:替换的内容不包括改行前面的void和末尾的{
我们下次在选择Geters And Setters时选择remove_m即可
package wzk.com.slidecloseactivity;
/**
* @author WangZhengkui on 2016-02-24 12:17
*/
public class Test {
String mText;
String mContext;
public String getText() {
return mText;
}
public Test setText(String mText) {
this.mText = mText;
return this;
}
public String getContext() {
return mContext;
}
public Test setContext(String mContext) {
this.mContext = mContext;
return this;
}
}
至此,大功告成