2017-09-30 14 views
0

コード1はサンプルプロジェクトのもので、コードを変更してコード2に変更し、コード2も正しく実行できます。Kotlinのコード1とコード2の違いは何ですか?

コトルのコード1とコード2の違いは何ですか?ありがとう!

コード1

data class ForecastList(val id: Long, val city: String, val country: String, val dailyForecast: List<Forecast>) { 

    val size: Int 
     get() = dailyForecast.size 

    operator fun get(position: Int) = dailyForecast[position] 
} 

コード2

data class ForecastList(val id: Long, val city: String, val country: String, val dailyForecast: List<Forecast>) { 

    val size: Int = dailyForecast.size 

    operator fun get(position: Int) = dailyForecast[position] 
} 
+0

[here](https://kotlinlang.org/docs/reference/properties.html#getters-and-setters)の構文を見てください。 – BakaWaii

答えて

3

バッキングフィールドの値を格納し、建設にdailyForecast.sizeを評価し、値を返すアクセサを作成する最初のこの裏打ち場の

2番目のフィールドはバッキングフィールドを作成しませんが、代わりにsizeを取得するたびに式dailyForecast.sizeを評価するアクセサを作成します。

+0

ありがとうございます、コード1が小さなシステムリソースを費やすことを意味しますか? – HelloCW

+0

@HelloCWこれは、より多くのリソースを多くのものに費やすことができます。たとえば、 'dailyForecast.size'を評価するのにどれだけの費用がかかりますか、' ForecastList'の 'size'をどのくらい頻繁に見ますか?ほとんどの場合、 'dailyForecast.size'はおそらく評価するのが安いので、効率の差はごくわずかです - より明確なコード(#2)になります。 'dailyForecast.size'が高価な場合は、' ForecastList.size'のほとんどが呼び出されない場合は#1を使用し、通常は 'ForecastList.size'が複数回呼び出される場合は#2を使用します。 (通常1回呼び出される場合、効率はほぼ同じです。) –

+0

@HelloCW時には効率のためではなく、望ましいセマンティクスのために、1つが選択されることがあります。たとえば、 'dailyForecast.size'の値が時間とともに変化し、' ForecastList.size'が常にあなたに現在の値を伝えたい場合は、#1で行く必要があります。 –

関連する問題