Java模因拒絕死亡

也有標題; 我的寵物討厭Java編碼。

有許多Java模因讓我很煩,部分是因為它們總是一個壞主意,但主要是因為人們在找到更好的替代方案后的幾年里仍在繼續使用它們。

使用StringBuffer代替StringBuilder

從2004年開始,用于StringBuffer的Javadoc

從JDK 5版本開始,該類已經添加了一個等效類,該類旨在供單線程StringBuilder使用。 通常應優先使用StringBuilder類,因為它支持所有相同的操作,但它卻更快,因為它不執行同步,因此它優先于此類使用。

StringBuilder不僅是一個更好的選擇,而且本來可以使用同步StringBuffer的情況非常罕見,這與以往不同,這是一個好主意。

說你有代碼

// run in two threads
sb.append(key).append("=").append(value).append(", ");

每個追加都是線程安全的,但是可以隨時釋放該鎖,這意味著您可以

key1=value1, key2=value2, 
key1=key2value1=, value2, 
key1key2==value1value2, ,

更糟糕的是,為了提高效率,JIT和JVM將試圖在兩次調用之間保持鎖定。 這意味著您可以擁有可以通過所有測試并可以在生產環境中使用多年的代碼,但是很少中斷,這可能是由于升級JVM所致。

使用DataInputStream讀取文本

另一個常見的模因是在讀取以下模板中的文本時使用DataInputStream(三個行,兩個閱讀器在同一行),我懷疑有一個原始代碼被復制了。

FileInputStream fstream = new FileInputStream("filename.txt");  
DataInputStream in = new DataInputStream(fstream);  
BufferedReader br = new BufferedReader(new InputStreamReader(in));

這是不好的,原因有三個

  • 由于BufferedReader的緩沖性質,您可能會傾向于使用in來讀取無法使用的二進制文件。 (我已經看到了這個嘗試)
  • 同樣,您可能會相信DataInputStream在不這樣做的情況下會在此處做一些有用的事情
  • 有一種更短的方法是正確的。
BufferedReader br = new BufferedReader(new FileReader("filename.txt")); 
// or with Java 7.
try (BufferedReader br = new BufferedReader(new FileReader("filename.txt")) {// use br
}

使用雙重檢查鎖定創建單例

首次使用Double Checked鎖定時,這是一個壞主意,因為JVM不安全地支持此操作。

// Singleton with double-checked locking:
public class Singleton {private volatile static Singleton instance;private Singleton() { }public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

問題在于,直到Java 5.0為止,這通常是可行的,但在內存模型中無法保證。 有一個更簡單的選項是安全的,不需要顯式鎖定。

// suggested by Bill Pugh
public class Singleton {// Private constructor prevents instantiation from other classesprivate Singleton() { }/*** SingletonHolder is loaded on the first execution of Singleton.getInstance()* or the first access to SingletonHolder.INSTANCE, not before.*/private static class SingletonHolder {public static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

這仍然很冗長,但是可以正常工作,不需要顯式鎖定,因此可以更快。

在Java 5.0中,當他們修復內存模型以安全地處理雙重鎖定時,他們還引入了枚舉,從而為您提供了更為簡單的解決方案。

約書亞·布洛赫(Joshua Bloch)在他的第二本書《有效的Java》中聲稱“單元素枚舉類型是實現單例的最佳方法”

使用枚舉,代碼看起來像這樣。

public enum Singleton {INSTANCE;
}

這是延遲加載的,線程安全的,沒有顯式的鎖并且簡單得多。

參考: Java模因在Vanilla Java博客上拒絕死于我們的JCG合作伙伴 Peter Lawrey。


翻譯自: https://www.javacodegeeks.com/2012/08/java-memes-which-refuse-to-die.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371314.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371314.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371314.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python TK編程第一部分 Hello Again

當你想寫大一點的程序的時候,將你的代碼封裝到一個或者多個類里會是一個不錯的辦法。下面hello world這個例子來自Matt Conway的Tkinter Life Preserver. [python]view plain copy from Tkinter import * class App: def __init__(self, master): …

視網膜脫離oct報告圖_剛剛,愛爾眼科發布關于艾芬醫生診療過程的核查報告

剛剛,愛爾眼科醫院集團發布關于艾芬女士診療過程的核查報告,內容如下:得悉艾芬女士對武漢愛爾眼科醫院白內障診療存疑,愛爾眼科醫院集團高度重視,第一時間成立了工作組奔赴武漢,對事件的診療全過程開展了核…

20145233《網絡對抗》第二周 后門原理與實踐

20145233《網絡對抗》第二周 后門原理與實踐 實驗內容 windows主機與kali虛擬機實現互聯互通使用netcat獲取主機操作Shell,cron啟動使用socat獲取主機操作Shell, 任務計劃啟動使用MSF meterpreter生成可執行文件,利用ncat或socat傳送到主機并運行獲取主機…

Spring 3.1:緩存和EhCache

如果在網上查找使用Spring 3.1內置緩存的示例,那么通常會碰到Spring的SimpleCacheManager ,Spring的家伙說這對“用于測試或簡單的緩存聲明很有用”。 實際上,我更喜歡將SimpleCacheManager看作是輕量級的,而不是簡單的。 在您希望…

mysql-表完整性約束

閱讀目錄 一 介紹二 not null與default三 unique四 primary key五 auto_increment六 foreign key七 總結一 介紹 回到頂部 約束條件與數據類型的寬度一樣,都是可選參數 作用:用于保證數據的完整性和一致性主要分為: PRIMARY KEY (PK) 標識…

可消費消息數量_17 個方面,綜合對比 主流消息隊列

一、資料文檔二、開發語言三、支持的協議四、消息存儲五、消息事務六、負載均衡七、集群方式八、管理界面九、可用性十、消息重復十一、吞吐量TPS十二、訂閱形式和消息分發十三、順序消息十四、消息確認十五、消息回溯十六、消息重試十七、并發度本文將從,Kafka、Ra…

opencv2.4.13+python2.7學習筆記--使用 knn對手寫數字OCR

閱讀對象:熟悉knn、了解opencv和python。 1.knn理論介紹:算法學習筆記:knn理論介紹 2. opencv中knn函數 路徑:opencv\sources\modules\ml\include\opencv2\ml\ml.hpp 3.案例 3.1數據集介紹 我們的目的是創建一個可以對手寫數字進行…

如何遠程管理Quartz

選項1:JMX 許多人問他們是否可以通過JMX管理Quartz,但我不確定為什么Quartz doc甚至不會提及它。 是的,您可以使用quartz.properties的以下命令啟用石英中的JMX org.quartz.scheduler.jmx.export true之后,您可以使用標準的JMX客…

熱啟動必須聯網嗎_供暖結束,地暖是關閉供水閥門還是關閉回水閥門?你做對了嗎?...

天氣漸漸暖和起來很多城市都停止供暖了一些家庭也停止使用地暖那么今天就來聊一聊,停止供暖后地暖系統應該怎么保養地暖不用時候是關閉供水閥門還是關閉回水閥門?供暖結束 暖氣閥門到底要不要關一般來說,我們供暖期結束是不用關閉總閥門的。因…

python學習(九) 網絡編程學習--簡易網站服務器

python 網絡編程和其他語言都是一樣的,服務器這塊步驟為:1. 創建套接字2. 綁定地址3. 監聽該描述符的所有請求4. 有新的請求到了調用accept處理請求 Python Web服務器網關接口(Python Web Server Gateway Interface,簡稱“WSGI”&…

concurrency 方面的books

http://joeduffyblog.com/2016/11/30/15-years-of-concurrency/轉載于:https://www.cnblogs.com/WCFGROUP/p/6566150.html

Spring 3.1緩存和配置

我最近在博客中談論有關Spring 3.1及其新的緩存注釋Cacheable和CacheEvict 。 與所有Spring功能一樣,您需要進行一定數量的設置,并且通常使用Spring的XML配置文件來完成。 在緩存的情況下,打開Cacheable和CacheEvict并不容易,因為…

按條件分類_保稅倉儲企業能否同時存儲非保貨物?“倉儲貨物安裝臺分類監管”如何申請?...

保稅倉儲企業能否同時存儲非保貨物呢?保稅和非保貨物是不是真的不能同在一個“屋檐下”呢?哪些企業可以開展“倉儲貨物按狀態分類監管”業務?企業又該如何申請該項業務?本文就對這些問題進行一下梳理。什么是“倉儲貨物按狀態分類…

ZooKeeper的原理(轉)

一、ZooKeeper的角色 領導者(Leader),負責進行投票的發起和決議,更新系統狀態。 學習者(Learner),包括跟隨者(Follower)和觀察者(Observer)&#…

java課堂筆記

轉載于:https://www.cnblogs.com/16-C-kai/p/6567042.html

Spring– DAO和服務層

歡迎來到Spring教程的第三部分。 在這一部分中,我們將繼續編寫Timesheet應用程序,這次我們將實現DAO層,業務服務并編寫一些測試。 在上一部分中,我們定義了GenericDao接口,該接口告訴我們需要對實體執行哪些操作。 現在…

51nod 1907(多項式乘法啟發式合并)

題目: 分析: 對于一個確定的生成子圖,很明顯是在一個連通塊上走,走完了再跳到另一個連通塊上,假設連通塊個數為cnt,那么答案一定是$min(a_{cnt-1},a_cnt,..,a_{n-1})$ 那現在的問題就是如何求出對于原圖而言…

煮飯的機器人作文_公示|“筆隨我心、心由筆動”作文大賽獲獎名單

卡士大昌杯“筆隨我心、心由筆動”獲獎作品開平的咸湯圓滑輪記/我的宅家成長記折疊式小屋/夕陽/包粽子在過去的卡士大昌杯“筆隨我心、心由筆動”作文活動中我們收到了許多優秀投稿經過專業團隊評選得出獲獎選手作品如下主辦方協辦方一等獎《…

BZOJ 4491: 我也不知道題目名字是什么

4491: 我也不知道題目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 278 Solved: 154[Submit][Status][Discuss]Description 給定一個序列A[i],每次詢問l,r,求[l,r]內最長子串,使得該子串為不上升子串或不下降子串 Input 第一…

Spring-boot中讀取config配置文件的兩種方式

了解過spring-Boot這個技術的,應該知道Spring-Boot的核心配置文件application.properties,當然也可以通過注解自定義配置文件的信息。 Spring-Boot讀取配置文件的方式: 一.讀取核心配置文件信息application.properties的內容 核心配置文件是指…