web-dev-qa-db-ja.com

Kotlinの関数型変数にnull値を割り当てる方法は?

コールバックを保持する変数があり、デフォルトではその値は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値を割り当てる方法は?

38
x2bool

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

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

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

callback1?.invoke()

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

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

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

お役に立てれば!

60
Sean Reilly