[英]What is the purpose of explicit getters in kotlin?
在面向 object 的語言中,使用 getter 和 setter 是一種眾所周知的做法。 這樣做是為了更好地控制變量。 為了實現這一點,我們在 java 中將變量設為私有,因此我們需要 getter 和 setter。
但在 kotlin 中並非如此。 默認情況下,這里甚至通過 getter 和 setter 訪問公共變量。 雖然 setter 可用於驗證對變量的賦值,但 getter 只是返回存儲的變量(我認為這就是為他們准備的)。 因此,根本不需要自定義 getter。
我還看到了此功能的一些錯誤用法,他們沒有編寫零參數 function,而是使用 val 並在 getter 中進行計算。 這會產生一種錯覺,認為該事物只是一個 val,但實際上它不存儲任何內容,而是每次都執行計算。
那么是否真的需要自定義吸氣劑?
getter 只是返回存儲的變量(我認為這就是為他們准備的)。 因此,根本不需要自定義 getter。
如果真是這樣,為什么在 Java 中有吸氣劑? 封裝的目標之一是確保 class 的變化不會改變它的 API。 在 Kotlin 中也是如此。
我還看到了此功能的一些錯誤用法,他們沒有編寫零參數 function,而是使用 val 並在 getter 中進行計算。 這會產生一種錯覺,認為該事物只是一個 val,但實際上它不存儲任何內容,而是每次都執行計算。
對於自定義 getter,這是一個完全有效的用例。 在 Kotlin 中,不能假設使用屬性完全沒有開銷。 在使用 getter 或零參數 function 的屬性之間進行選擇時,有很多問題要問自己:
walk()
, build()
等)firstName
, lastIndex
等)此外,屬性 getter 不應該拋出異常,應該在第一次訪問時計算成本低或緩存,並且應該為多次連續執行返回相同的結果。 以下是標准庫中的示例:
ArrayDeque.first()
是一個 function,如果雙端隊列為空則拋出。List.lastIndex
是一個屬性,計算起來很便宜。Lazy<T>.value
是一個屬性,該值在首次訪問時計算並緩存。大多數委托屬性都使用自定義 getter。
更多閱讀:
只是更多的信息。 除了可讀性之外,定義自定義 getter 的可能性允許您在不更改其公共成員的情況下演變 class,即使您從沒有自定義 getter 的簡單val
開始。
在沒有 Java 等屬性的語言中,如果您定義公共字段:
public class Foo {
public final int value;
public Foo(int value) {
this.value = value;
}
}
然后稍后您想要修改 class 以添加一個功能,如果您翻轉 Boolean,它將返回否定值,如果不破壞使用 ZA2F2ED4F8EBC2CBB4C21A29DC4 原始版本的代碼,就無法做到這一點。 因此,您應該從一開始就使用 getter 和 setter。
但是在 Kotlin 中,你不能像這樣直接暴露背景字段,所以不可能像在 Java 中使用公共字段那樣在角落里畫自己。 如果你原來的 class 是這樣的:
class Foo(val value: Int)
您可以像這樣修改它以添加該功能,並且對已經使用 class 的代碼沒有影響。
class Foo(private val originalValue: Int) {
var isNegated = false
val value: Int
get() = if (isNegated) -originalValue else originalValue
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.