簡體   English   中英

使用Kotlin屬性訪問語法來設置Java字段是否安全

[英]Is it safe to use Kotlin property access syntax to set a Java field

這是一個假設的問題。 情況如下:我從Kotlin文件調用Java類的setter來更改私有字段x的值

javaFoo.setX(420)

IDE建議將其更改為

javaFoo.x = 420

它正常工作。

現在假設setter里面有一些復雜的功能,后來在Java類中的x字段被改為public而不是private 沒有編譯錯誤,但Kotlin調用將改變x跳過setter中發生的其他東西的值,並且它可能會被忽視而導致邏輯錯誤。 因此我想知道: 使用Kotlin屬性訪問語法來設置java字段是否安全?

您對語言語義的分析是正確的。 您描述的目標類的更改確實會改變Kotlin的屬性訪問語法的語義。 但是,在回答您的問題時,這個事實並不是唯一要考慮的問題,因為問題是否使用該語法是安全的

在討論沒有任何實際約束的假設情景時,幾乎任何事情都是可能的,並且在該視圖下沒有語言結構是“安全的”。 如果有一天,Kotlin團隊決定將x++的語義改為“返回x平方,而不是改變x ”,該怎么辦? 從理論上講,這是可能的。 不過可能嗎?

在您的問題中應用相同的常識邏輯,類的維護者決定打破迄今為止隱藏在具有自定義邏輯的setter后面的字段的封裝的情況極不可能。 實際上,如果對所有Java庫項目進行歷史分析,您可能找不到發生過這種情況的單個實例。


也就是說,您的假設場景可能被視為分散了快捷語法的實際問題。 使用它來調用具有自定義邏輯的setter可能會很尷尬和誤導,因為它打破了我們的直覺。

在Android上,一個這樣的例子是ImageView.get/setImageMatrix 你可以寫

imageMatrix.rotate = 30

並期望有效,但實際上,你寫的代碼是破碎的。 你應該寫的

val tmpMatrix = Matrix()
tmpMatrix.set(imageMatrix)
tmpMatrix.rotate = 30
imageMatrix = tmpMatrix

根據我們的Java直覺,實際上這個版本看起來很破舊,浪費了一個似乎沒有目的的對象分配。 但是如果你閱讀了setImageMatrix的契約,你會發現它比僅僅將對象分配給一個字段要多得多,它實際上將轉換應用於圖像視圖。 類似地,getter的契約不允許改變返回的對象。


我沒有看到很多關於Kotlin這個功能的爭論,但我認為它是從Java遷移的人們的潛在漏洞來源。 要走的路是重新訓練你的直覺,讓自己認識到Kotlin的任何財產訪問可能意味着遠遠超過眼睛。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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