Eventbus等がとても便利なため、最近では使用機会が減っているのかもしれませんが、
Androidでは自作のView等からActivityやFragmentに対して何らかのコールバックをする場面が多々あります。
Kotlinのプロパティを使うとJavaで書いていたコールバック処理がとても簡潔に書けます。
Java
public class CustomView extends View {
private CallBack callBack;
public void setCallBack(CallBack callBack) {
this.callBack = callBack
}
private void hoge() {
if(callBack == null) return;
callBack.onClickHoge(); // call here
}
public interface CallBack {
public void onClickHoge();
}
}
public class HogeActivity extends AppCompatActivity implements CallBack {
@Override
public void onClickHoge() {
...
}
}
こんな感じのコードを見たことあるかと思います。
Kotlinのプロパティと関数リテラルを用いると上記のJavaコードがこのようになります。
Kotlin
class CustomView : View {
var onClickHoge: (() -> Unit)? = null
private void hoge() {
onClickHoge?.invoke() // call here
}
}
class HogeActivity : AppCompatActivity {
val view: CustomView by bindView(R.id.customView) // kotter knife
fun hoge() {
view.onClickHoge = {
...
}
}
}
これだけです。
とても簡潔ですね。
早期return
ただ、この書き方だとただのBlockになってしまうので、以下のような早期returnが出来ません。
view.onClickHoge = {
if(foo == 0) return
....
}
そこで、Jump Labelを使います。
view.onClickHoge = block@ {
if(foo == 0) return@block
....
}
Jump Labelは個人的にGoto文のようになってしまうので、あまり使いたくは無かったのですが
このように数行のblock内での早期retunに限って使うのならば問題ないと感じました。