我正在参与「启航计划」
本篇文章首要介绍常用到的几个kotlin开发技巧,能够帮助咱们削减对事务层代码的修正,以及削减模板代码的编写。
善用@get/@set: JvmName()注解并搭配setter/getter运用
假定当时存在下面三个类代码:
#Opt1
public class Opt1 {
private String mContent;
public String getRealContent() {
return mContent;
}
public void setContent(String mContent) {
this.mContent = mContent;
}
}
#Opt2
public class Opt2 {
public void opt2(Opt1 opt1) {
System.out.println(opt1.getRealContent());
}
}
@Opt3
public class Opt3 {
public void opt3(Opt1 opt1) {
System.out.println(opt1.getRealContent());
}
}
这个时分我想将Opt1类重构成kotlin,咱们先看下经过AS的指令Convert Java File to Kotlin File主动转化的成果:
能够看到为了兼容Opt2和Opt3的调用,直接把我的特点名给改成了realContent,kotlin会主动生成getRealContent()和setRealContent()办法,这样Opt2和Opt3就不必进行任何调整了,kotlin这样就显得太过于智能了。
这样看起来没啥问题,可是java重构kotlin,直接把特点名给我改了,并隐式生成了特点的set和get办法,关于java而言不运用的办法会报灰提示或者只有当时类运用AS会正告能够声明成private,可是关于kotlin生成的set、get办法是隐式的,容易疏忽。
所以大家在运用Convert Java File to Kotlin File指令将java重构kotlin的成果一定不能抱有百分之百的信任,即使它很智能,但还是一定要细细的看下转化后的代码逻辑,或许还有不少的优化空间。
这个地方就得需求咱们手动进行修正了,比方不想对外露出修正这个字段的set办法,调整如下:
class Opt1 {
var realContent: String? = null
private set
}
再比方坚持原有的字段名mContent,不能被改为realContent,一起又要确保兼容Opt2和Opt3类的调用不能报错,且尽量避免去修正里面的代码,咱们就能够做如下调整:
class Opt1 {
@get: JvmName("getRealContent")
var mContent: String? = null
private set
}
善用默许参数+@JvmOverloads削减模板代码编写
假定当时Opt1有下面的办法:
public String getSqlCmd(String table) {
return "select * from " + table;
}
且被Opt2和Opt3进行了调用,这个时分假如有另一个类Opt3想要调用这个函数并只想从数据库查询指定字段,假如用java完成有两种办法:
- 直接在
getSqlCmd()办法中增加一个查询字段参数,假如传入的值为null,就查询一切的字段,否则就查询指定字段:
public String getSqlCmd(String table, String name) {
if (TextUtils.isEmpty(name)) {
return "select * from " + table;
}
return "select " + name + " from " + table;
}
这样一来,是不是本来Opt2和Opt3对getSqlCmd()办法调用是不是需求改动,多传一个参数给办法,而在日常的项目开发中,有或许这个getSqlCmd()被几十个地方调用,难道你一个个的改过去?不太现实且是一种十分糟糕的完成。
- 直接在
Opt1中新增一个getSqlCmd()的重载办法,传入指定的字段去查询:
public String getSqlCmd(String table,String name) {
return "select " + name + " from " + table;
}
这样做的好处便是不必调整Opt2和Opt3对getSqlCmd(String table)办法调用逻辑,可是会编写许多模板代码,尤其是getSqlCmd()这个办法体或许七八十行的情况下。
假如Opt1类代码削减即200-400行且不担任的情况下,咱们能够将其重构成kotlin,借助于默许参数来完成办法功能增加又不必编写模板代码的效果(假如你的Java类上千行又很杂乱,请谨慎转化成kotlin运用下面这种办法)。
@JvmOverloads
fun getSqlCmd(table: String, name: String? = null): String {
return "select ${if (name.isNullOrEmpty()) "*" else name} from $table"
}
增加默许参数name时还要增加@JvmOverloads注解,这样是为了确保java只传一个table参数也能正常调用。
经过上面这种办法,咱们就能确保完成了办法功能增加,又不必改动Opt2、Opt3关于getSqlCmd()办法的调用逻辑,而且还不必编写额外的模板代码,一举多得。
总结
本篇文章首要介绍了在java重构成kotlin过程中比较常用到的两个技巧,最终完成效果是削减对事务逻辑代码的侵略,期望能对你有所帮助。

