簡體   English   中英

為什么我們需要可變類?

[英]Why we need mutable classes?

我今天讀了一章Effective Java。 本章是關於最小化對象的可變性。 我非常理解為什么不可變對象是好的,比如線程安全,簡單等等。我的問題是因為不可變對象有很多優點,是否有任何可變對象首選的情況?

您需要可變類來處理將類從狀態A為狀態Z會產生大量中間對象的情況,您寧願不花時間創建它們。

一個經典的例子是連接一個字符串數組。 假設您需要連接100個字符串,並生成單個結果。 如果沒有可變字符串,您將需要生成98個中間對象,這些對象幾乎可以立即進行垃圾收集。 這在CPU上相當浪費,使可變對象成為正確的解決方案。

在需要可變對象時還有其他情況。 例如,將可變對象傳遞給方法可以讓您收集多個結果,而不會跳過太多語法箍。 另一個例子是排序和過濾:當然,您可以創建一個獲取原始集合的方法,並返回一個已排序的方法,但這對於較大的集合來說會變得非常浪費。

不可變類可能會浪費內存和垃圾收集器時間,因為更改數據會產生浪費的實例。 但是,函數式編程方法對於不可變類非常有效。

功能方法可用於修改數據,然后向開發人員提供不可變類。 這種方式可變類從開發人員中抽象出來。 功能帶來了其他好東西,例如延遲加載和這些抽象調用的幕后優化。

Java 8流API可用於提供處理數據的功能方式。 您可能還想嘗試Scala,它是Java的一種功能變體。

也就是說,最好將最復雜和性能至關重要的任務留給更傳統的編程實踐。 通過精心規划的架構和適當的同步,可變對象將非常有效。 當僅使用不可變對象時,大量流量使垃圾收集器非常繁忙。

功能編程方法可以合理地抽象出來的功能數量總是有限的。 功能編程似乎在前端開發中非常有用,其中架構復雜性通常不是很高。

這是因為對象的可變狀態/屬性的性質。 例如,一個Person的年齡會發生變化, Employee薪水會發生變化, Television的音量/頻道/亮度會在一段時間內發生變化。

會有大量的例子表明Object的狀態可以改變。

暫無
暫無

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

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