Java程序中的延遲加載功能使用
使用多個對象或者大數(shù)據(jù)結構時,一種提升其性能的方式是運用延遲加載或賦值(來實現(xiàn))。將費時的操作盡可能的縮短的想法,從未實現(xiàn)。我通過一些例子來說明延遲加載技術在Java中如何運用,給予一些指引以在其他語言中能更易(使用)并作為核心語言的一部分。
一種使用場景是通過JTable來展示數(shù)百個包含元數(shù)據(jù)和測量值得域對象。初始化我們的域對象在內存中能保存兩種類型的對象,即便在表格中僅顯示部分元數(shù)據(jù)。構建該表格將花費數(shù)秒鐘的時間,(但)我們可以接受再次展示數(shù)百項(數(shù)據(jù))。在做了一些分析過后,我們改進了我們的實現(xiàn),看起來像這樣:
public class DomainObject { private final DataParser parser; private final Map<String, String> header = new HashMap<>(); private final List<Data> data = new ArrayList<>(); public DomainObject(DataParser aParser) { parser = aParser; } public String getHeaderField(String name) { // Here we lazily parse and fill the header map if (header.isEmpty()) { header.addAll(parser.header()); } return header.get(name); } public Iterable<Data> getMeasurementValues() { // again lazy-load and parse the data if (data.isEmpty()) { data.addAll(parser.measurements()); } return data; } }
這種改進改善了顯示時間的條目和顯著提高了我們處理大數(shù)據(jù)項的(能力)。所有的數(shù)據(jù)載入僅在有人想查看測量的具體細節(jié)和雙擊某條目時才會發(fā)生。
一種java拆箱后得到延遲賦值在條件語句的情況下
// lazy and fast because the expensive operation will only execute when needed if (aCondition() && expensiveOperation()) { ... } // slow order (still lazy evaluated!) if (expensiveOperation() && aCondition()) { ... }
持久層框架像Hibernate時常默認延遲加載是因為在通常情況下數(shù)據(jù)庫訪問并且數(shù)據(jù)傳送代價相當高昂。
大多數(shù)語言功能是基于環(huán)繞延遲賦值的情況下這種理論上的功能如同第一個類所有成員最大程度上隔離降低副作用對延遲的影響。Scala混合了面向對象語言功能并引進延遲關鍵字簡化了java樣式,延遲初始代碼就像下面這樣
public class DomainObject(parser: DataParser) { // evaluated on first access private lazy val header = { parser.header() } def getHeaderField(name : String) : String = { header.get(name).getOrElse("") } // evaluated on first access lazy val measurementValues : Iterable[Data] = { parser.measurements() } }
結論
延遲加載不是新的革命性技術但當處理大數(shù)據(jù)或放慢資源卻是一個非常有用的工具。在這些很多情況下你能使用它提升性能或使用者親身經(jīng)歷使用它。
它可以降低實現(xiàn)代碼的成本如果語言支持不是很好(像java)和其它一些情況的下應用就要在預編譯預處理情況下感受更多的響應。
相關文章
RocketMQ源碼解析topic創(chuàng)建機制詳解
這篇文章主要為大家介紹了RocketMQ源碼解析topic創(chuàng)建機制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08thymeleaf中前后端數(shù)據(jù)交互方法匯總
這篇文章主要介紹了thymeleaf中前后端數(shù)據(jù)交互小結,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2022-07-07JAVA中實現(xiàn)原生的 socket 通信機制原理
本篇文章主要介紹了JAVA中實現(xiàn)原生的 socket 通信機制原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別
這篇文章主要介紹了java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-09-09Spring Boot中整合Spring Security并自定義驗證代碼實例
本篇文章主要介紹了Spring Boot中整合Spring Security并自定義驗證代碼實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04