成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

開發者應該避免使用的6個Java功能

移動開發
本文作者是一名擁有多年Java開發經驗的程序員,他從經驗中得出,并不是所有的Java SE功能/API都值得程序員去使用,比如本文列舉的這6個,大家在使用前得慎重對待。以下是對原文的摘譯。

作者從多年的經驗中吸取到,有六個Java SE功能/API是不提倡Java程序員使用的,它們分別是Reflection、Bytecode manipulation、ThreadLocals、Classloaders、Weak/Soft references、Sockets。
本文作者是一名擁有多年Java開發經驗的程序員,他從經驗中得出,并不是所有的Java SE功能/API都值得程序員去使用,比如本文列舉的這6個,大家在使用前得慎重對待。以下是對原文的摘譯。

多年的Java開發經驗告訴我,從長遠角度來看,以下這些Java SE功能/API,開發者***停止使用。

Reflection
Bytecode
manipulation
ThreadLocals
Classloaders
Weak/Soft references
Sockets

1.Reflection

Reflection即反射,在許多流行的庫里面都有反射機制,比如Spring和Hibernate。通過對業務代碼進行反思,我建議大家避免使用反射。下面列出我反對使用的原因:

首先涉及到代碼可讀性/工具支持。打開IDE并且在Java代碼里找到相互依賴關系。使用relection替換方法調用,并且試著重復該步驟。事情變的愈發不可收拾,正常情況下都應該封裝好了再修改狀態。下面來看看具體代碼示例:

  1. public class Secret { 
  2.     private String secrecy; 
  3.     public Secret(String secrecy) { 
  4.         this.secrecy = secrecy; 
  5.     } 
  6.     public String getSecrecy() { 
  7.         return null
  8.     } 
  9. public class TestSecrecy { 
  10.     public static void main(String[] args) throws Exception { 
  11.         Secret s = new Secret("TOP SECRET"); 
  12.         Field f = Secret.class.getDeclaredField("secrecy"); 
  13.         f.setAccessible(true); 
  14.         System.out.println(f.get(s)); 
  15.     } 
  16.   

通過查看以上代碼可以得知,方法getDeclaredField()參數只有在運行時才可以被發現。而你也清楚,運行時產生的bug總比不執行腳本要更加棘手。

其次,反射調用優化是由JIT執行的,一些優化可能需要花費很長時間才能得到應用,而有些優化甚至都得不到應用,所以關于反射的性能優化有時會被數量化。但在一個典型的業務應用程序中——你可能不會真正意識到這些性能開銷。

總之,開發者應該通過AOP合理地在業務層使用反射,除此以外,你***離它遠遠的。

2.Bytecode manipulation.

字節碼操作,如果我看到你在Java EE應用程序里直接使用CGLIB或ASM,我可能會立即跑開。

最糟糕的事情莫過于在編譯期間沒有任何可執行的代碼。實際上,當產品在運行時,你根本不知道哪塊代碼在運行。所以,當你遇到麻煩時,會自然地把錯誤拋給運行時故障排除和調試,不過這樣反而會更麻煩。

3.ThreadLocals

這里有兩個不相關的原因,當我在業務層代碼里看到ThreadLocals時會顫抖。首先,在ThreadLocals的幫助里,你可能會看到許多變量的使用都沒有通過方法調用鏈來明確地向下傳遞。這在某些場合下是有用的,但當你一旦粗心,你會在代碼里構建許多意料不到的依賴關系。

第二個不相關的原因與我日常的工作相關,在ThreadLocals里存儲數據會引發內存泄露。最起碼我遇到的Permgen泄露有十分之一都是使用ThreadLocals造成的,在結合了類加載器和線程池后,“java.lang.OutOfMemoryError:Permgen space”異常可能就馬上出現了。

4.Classloaders

首先,類加載器是一個復雜的野獸。你必須先了解它的層次結構、委托機制、類緩存等等。即使你認為自己已經掌握了,它可能還是不能正常工作。最終將導致一個類加載器泄露問題。因此我只能建議你將這個任務留給應用服務器處理

5.Weak/Soft references

現在,你應該更好的理解Java的內部方法。使用軟引用來重寫所有的緩存并不明智。我知道,當你手上拿著錘子的時候,就會到處尋找釘子。可對于錘子來說,緩存并不是個好釘子。為什么?基于軟引用構建緩存可能是如何委托一些復雜因素到GC而不是通過自身實現的一個好例子。

下面舉個緩存的例子,你使用軟引用來創建數據,當內存被耗盡時,GC進入并且進行清理。但是,緩存中被刪除的對象并未得到你的控制,而且很有可能在下一次的cache-miss中重新創建。如果內存仍然不足,你可以觸發GC進行再次清理。你可能已經看出了整個運行過程的惡性循環,整個應用程序就變成了CPU與GC不斷運行的狀態了

6.Sockets

普通老式的java.net.Socket實在是太復雜,以至于很難弄正確。我覺得阻塞性是其根本性的缺陷。當你編寫一個典型的帶有Web前端的Java EE應用程序時,應用程序需要高并發度來支持大量的用戶,而你現在最不想發生的是不具有可擴展的線程池坐等阻塞套接字。

目前有許多精彩可用的第三方庫,使用它們可以更好的完成任務,比如Netty,開發者不妨嘗試下。

責任編輯:張葉青 來源: eoe Android開發者社區
相關推薦

2015-11-12 09:24:56

2012-03-07 09:41:01

Java

2012-11-13 10:34:03

PythonWeb

2012-10-11 10:43:26

開發SQL

2011-10-11 10:07:37

2016-03-04 10:18:24

xcode技巧開發

2016-03-04 10:25:50

Xcode技巧開發

2016-12-26 11:00:57

Java開發者工具

2017-10-23 09:27:47

2020-10-09 09:44:25

JavaScript 開發 應用

2011-02-21 09:37:53

Web開發 Firef

2011-03-24 09:25:54

程序員編程

2018-10-16 11:03:19

API開發者AR

2023-12-26 18:43:45

Java開發者趨勢

2017-04-12 09:42:29

Java開發工具

2017-09-18 10:36:35

Python類庫開發者

2022-01-23 11:12:29

前端開發編碼開發

2013-09-03 09:54:15

Web開發

2013-07-29 11:11:33

C++C++11

2023-11-27 15:49:55

軟件開發系統設計
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频三区 | 日韩中文在线 | 日本不卡在线观看 | 99爱国产| 亚洲综合视频 | 欧美99| 一区二区三区免费 | 欧美日韩久久精品 | 天天综合干 | 亚洲国产精品精华素 | 性做久久久久久免费观看欧美 | 免费视频一区二区 | 欧美精品1区 | 亚洲人在线观看视频 | 国产亚洲欧美在线 | 久久久久亚洲精品 | 成人欧美一区二区三区黑人孕妇 | 99久久精品免费看国产免费软件 | 视频一区 国产精品 | 久久久国产一区二区三区 | 欧美色人 | 99免费精品视频 | 久久草视频 | 亚洲精品一区二区三区免 | 亚洲精品区 | 国产日韩欧美 | 国产黄色精品在线观看 | 亚洲精品视频一区 | 国产99视频精品免视看9 | 久久三级av | 男女激情网站免费 | 欧美久久天堂 | 99re在线视频观看 | 亚洲欧美日韩系列 | 亚洲精品久久久久avwww潮水 | 日韩久久精品视频 | 成人亚洲视频 | 久热精品在线播放 | 日日天天| 少妇一区二区三区 | 韩国精品一区二区三区 |