58

コールバックを保持する変数があり、デフォルトではその値は null である必要があります。しかし、この構文は機能していないようです。

var callback1 : () -> Unit = null
var callback2 : ((a) -> c, b) -> Unit = null

私の現在の解決策は、コールバックにデフォルトの実装があることを確認することです。

var callback1 : () -> Unit = { }
var callback2 : ((a) -> c, b) -> Unit = { a, b -> }

ただし、これにより、コールバックが設定されているかどうかを確認することが難しくなり、デフォルトの実装には何らかのコストがかかる可能性があります (そうですか?)。Kotlinの関数型変数にnull値を代入する方法は?

4

1 に答える 1

90

Kotlin のすべての変数と同様に、通常、関数参照を null にすることはできません。?null 値を許可するには、次のように型定義の最後にa を追加する必要があります。

var callback1 : (() -> Unit)? = null
var callback2 : (((a) -> c, b) -> Unit)? = null

通常、関数型宣言全体を括弧で囲む必要があります。必須でなくても、おそらく良い考えです。invokeまた、ヌルセーフ演算子を使用して関数を呼び出す必要があります。

callback1?.invoke()

何もしない実装アプローチは、長期的にはおそらくより便利であり、私にはもう少し「kotlin-y」に思えます。コンピューター サイエンスのほとんどの場合と同様に、問題があることを示す特定のパフォーマンス データがない限り、既定の実装のパフォーマンス コストについて心配することはありません。

null 値を許可せずにコールバックが設定されているかどうかを判断する 1 つの方法は、null オブジェクトパターンを使用することです。

val UNSET_CALLBACK1: () -> Unit = {}
var callback1 : () -> Unit = UNSET_CALLBACK1
fun callback1IsSet(): Boolean {
    return callback1 !== UNSET_CALLBACK1
}

お役に立てれば!

于 2014-03-02T12:47:26.687 に答える