簡體   English   中英

發送網絡數據,可變與不可變數據結構

[英]Sending network data, mutable vs immutable data structure

我正在實現一個網絡協議庫,它涉及以50Hz的恆定速率發送數據。 實際的數據傳輸將在一個單獨的線程上完成。 作為庫的一部分,將有一個表示需要發送的所有數據的類,並且庫將負責序列化並傳輸它。

我的問題是我不確定如何設計這個數據類。 我想到的選項是:

  • 單個可變對象。 發送線程將鎖定對象,序列化它,然后解鎖它,以便客戶端可以再次修改它。 我認為這可能是最糟糕的選擇。
  • 可變對象,當作為參數傳遞時由庫克隆。 這樣,調用方法可以修改現有對象,同時不會干擾發送線程。
  • 不可變對象,因此每次調用方法都必須創建一個新對象,並重新填充數據。

我不確定是否要進行克隆路由,因為必須每秒創建一個新對象並填充50次。

對於克隆選項,我也想知道克隆像這樣的對象的最佳方法是什么。 我應該利用Object.clone(),我聽說過混合的東西,或者實現自定義復制方法/構造函數? 如果我定制一些東西,那么最強大的實現方法是什么? 基本上,我必須在代碼中編寫一個接一個地復制源對象的每個字段,我希望有一些更簡單的方法。

我會選擇一個可變對象和克隆。 如果沒有克隆,你就會有潛在的數據損壞,並且使你的類不可變會增加復雜性,這可能是沒有根據的。

是的,您的類應該實現Cloneable並覆蓋Object.clone() 如果您的任何實例變量類型是可變的,您也應該克隆它們。 例如:

class Data implements Cloneable {
    private int i; // int type is immutable
    private String s; // String type is immutable
    private List<String> l; // List type is mutable

    @Override
    public Data clone() {
        try {
            Data clone = (Data) super.clone();
            clone.l = new ArrayList<String>(l); // copy the mutable list
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e); // impossible
        }
    }

    // other class members
}

我會使用克隆的可變對象,因為它維護您的原始對象。 使用此解決方案,您可以克隆對象以發送它並修改原始對象以進行下一個發送任務。

克隆機制不應該是一個性能問題,因為克隆每秒50個對象不應該成為任何現代系統的問題(雖然我不知道你在做什么系統)。

暫無
暫無

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

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