簡體   English   中英

如何表明API返回不可修改/不可變的集合

[英]Ways to signal that API returns an unmodifiable/immutable collection

除了記錄它(顯然它也應該被記錄),使用特殊的返回類型(我擔心將自己限制為ImmutableX)或讓用戶在運行時發現,是否有任何其他方式告訴用戶他們從API獲得的集合的API是不可修改/不可變的?

是否有任何命名約定或標記注釋通用信號相同的東西?

編輯:不可修改和不可變並不意味着相同的事情,但為了這個問題的目的,它們是相似的。 這個問題基本歸結為讓用戶知道返回的對象沒有完全遵守它的契約(即一些常見的操作會引發運行時異常)。

不是一般的命名約定,但您可能對使用此@Immutable注釋感興趣: http@Immutable除了文檔目的,此機制還將驗證您的對象是否真的是不可變的(在它期間)實例化)並拋出運行時異常(如果不是)。

好的和詳細的解決方案是創建自己的UnmodifiableCollection包裝類,並返回它:

public UnmodifiableCollection giveMeSomeUnmodifableCollection() {
    return new UnmodifiableCollection(new LinkedList());
}

返回類型的名稱足以生成關於集合的不可修改性的詳細陳述。

  1. 記錄它確實
  2. 提供API以檢查給定對象是否是可模擬集合
  3. 包裝器中的返回集合將保存信息,其中的集合是可變的或不是 - 我最喜歡的解決方案
  4. 如果可能的話,不要使用mullable和immutable集合,而是選擇其中一個。 結果總是不可變的,因為它們是結果 - 為什么要改變它。 如果存在這樣的需求,將集合復制到新的,可變的並且修改它(例如用於鏈處理)是單行的問題。

在方法的返回類型上編寫@Immutable注釋是最好的方法。 它有多種好處:

  • 注釋記錄了用戶的意義
  • 工具可以驗證客戶端代碼是否遵循注釋(即,客戶端代碼沒有錯誤)
  • 工具可以驗證庫代碼是否遵循注釋(即,庫代碼沒有錯誤)

更重要的是,驗證可以在編譯時進行,然后再運行代碼。

如果要在編譯時進行驗證,可以使用IGJ Immutability Checker 它區分了抽象值永遠不會改變的@Immutable引用,以及無法執行哪些副作用的@ReadOnly引用。

暫無
暫無

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

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