构造对象的时候免不了要进行一些初始化的操作,我们可以使用java提供的构造代码块
使用kotlin后,我们多了别的选择
Standard.kt是kotlin封装好的一个工具类,其中的apply方法为
fun T.apply(block: T.() -> Unit): T { block(); return this }
可以看到返回值返回的是对象本身,很适合对象的初始化操作
htmlService.login(HashMap<String,String>().apply {
put("1","1")
})
通过AndroidStudio自带的show kotlin byteCode可以查看编译后的.class文件,
方法: Tools ->Koltin -> Show Kotlin ByteCode
,点击插件GUI的Decompile
反编译后的文件,可以看到
- 使用
apply{}
方法,和我们自己构造赋值一样,类似的还有with
,run
,let
方法,可以参照Kotlin系列之let、with、run、apply、also函数的使用 - 使用代码块
init{}
生成的就是java的代码块
public final void login() {
HtmlService var10000 = this.htmlService;
HashMap var1 = new HashMap();
HtmlService var4 = var10000;
var1.put("1", "1");
var4.login((Map)var1);
}
public final void login1() {
this.htmlService.login((Map)(new HashMap() {
{
this.put("1", "1");
}
// $FF: bridge method
public boolean containsValue(String var1) {
return super.containsValue(var1);
}
// $FF: bridge method
public final boolean containsValue(Object var1) {
return var1 instanceof String ? this.containsValue((String)var1) : false;
}
// $FF: bridge method
public String getOrDefault(String var1, String var2) {
return (String)super.getOrDefault(var1, var2);
}
// $FF: bridge method
public final Object getOrDefault(Object var1, Object var2) {
return var1 instanceof String ? this.getOrDefault((String)var1, (String)var2) : var2;
}
// $FF: bridge method
public boolean containsKey(String var1) {
return super.containsKey(var1);
}
// $FF: bridge method
public final boolean containsKey(Object var1) {
return var1 instanceof String ? this.containsKey((String)var1) : false;
}
........
}));
}
当然java中的静态代码块,构造代码块,方法代码块在kotlin中也是可以使用的
构造代码块
- 先看java中的构造代码块,这里的例子是一个匿名内部类的构造方法
void login() {
new HashMap<String, String>() {
{
put("1", "1");
}
};
}
- kotlin中需要加上
init{ }
来标识
htmlService.login(object : HashMap<String, String>() {
init {
put("1", "1")
}
})
静态代码块
- java中的静态代码块不多做说明
- kotlin是没有static的,这里想到的肯定是伴生对象
//java代码
static{
int aa =1;
}
//kotlin代码
companion object { //kotlin的静态代码块
init{
}
}
方法代码块
- java中的方法代码块不多做说明
- kotlin中的方法代码块,由于和kotlin中lambda简写的{ }冲突,系统会提示我们使用Standard.kt中的run{ }方法
image.png
//java
void test(){
{
int a = 1;
}
a = 2; //报错
}
//kotlin
fun test(){
run {
var a =1
}
a =2 //报错
}
和java中的{}一样,括号中声明的变量作用域仅限于括号内
网友评论