Android Studio的使用技巧 PS:源码解读

1 篇文章 0 订阅
1 篇文章 0 订阅

问题描述

根据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;
    }
}

至此,大功告成

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值