簡體   English   中英

kotlin 中顯式 getter 的目的是什么?

[英]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 的屬性之間進行選擇時,有很多問題要問自己:

  • 它描述行為嗎? 使用 function ( walk()build()等)
  • 它是否描述了 state? 使用屬性( firstNamelastIndex等)

此外,屬性 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM