3

ResultSetとして値を取得する2つの拡張関数を追加したいと思いLocalDateます。

fun ResultSet.getLocalDate(colName: String) = getDate(colName)?.toLocalDate()
fun ResultSet.getLocalDate(colIndex: Int) = getDate(colIndex)?.toLocalDate()

問題はgetDate()a を返すことです。明らかに、呼び出し前にDate!null エラーが発生する可能性があります。ただし、この拡張機能を使用する人は、結果をではなくとして使用する必要があります。?.toLocalDate()LocalDate?LocalDate!

一貫性のためにプラットフォームの種類を維持する方法はありますか? そして、拡張関数のユーザーに、null 許容を許可するかどうかを決定させますか? それとも、これを機能ではなく不便と見ているのでしょうか?

4

1 に答える 1

4

別の角度から見てみましょう: 関数が platform type の値を返すようにできれば、Java の安全でない null可能性LocalDate!が Kotlin コードでの関数の使用法に広がります。nullnull 以外の値。

一方、Kotlinは null セーフnullであり、NPE を引き起こす場所にサイレントに渡すことはできません。代わりに、すべての値が null 許容として渡されるか、null 以外のチェックまたはアサーションが渡されます。

プラットフォームの型は、言語では表示できません。これは、安全でない Java の null 可能性を処理する方法にすぎません (単にすべての Java 値を null 可能として扱うだけでは機能しません)。これらは、Java コードへのこの呼び出しが null を返さないと信じているT!ことを述べる方法を提供します。として扱うとT、それをチェックするためにアサーションが生成されます。T!それ以外の場合は、 nullable と同じようにプラットフォーム タイプを操作しT?ます。

Null の安全性は、Kotlin 言語設計の重要なポイントの 1 つであり、Kotlin コードの値ごとに null 許容かどうかを決定する必要があります。

API 設計には 2 つのオプションがあります。

  • 関数内の null 可能性をチェックして、null 以外の値を返します
  • null 許容値を返し、その可能性について呼び出し元に警告しますnull

ただし、関数にセマンティクスがあり、呼び出し元が特定の条件では戻らないと想定nullできる場合は、アサーションを行うラッパー関数を作成できます。!!これは、追加のロジックまたはフォールバックと組み合わせると実現可能ですが、そうでなければ、呼び出しサイトでのアサーション ( ) よりも簡潔になることはほとんどありません。

于 2016-03-29T15:39:59.873 に答える