日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

99%的Java程序員都會寫這樣的垃圾代碼

來源: 責(zé)編: 時間:2023-11-13 09:06:41 258觀看
導(dǎo)讀在軟件開發(fā)領(lǐng)域,編程經(jīng)驗往往與設(shè)計、編碼、重構(gòu)和測試的能力相輔相成。隨著時間的推移,這些技能的提升使您能夠在日常工作中脫穎而出。然而,有時候我們可能陷入固定的編程模式,導(dǎo)致編碼習(xí)慣停滯不前。在這篇文章中,我們將

jco28資訊網(wǎng)——每日最新資訊28at.com

在軟件開發(fā)領(lǐng)域,編程經(jīng)驗往往與設(shè)計、編碼、重構(gòu)和測試的能力相輔相成。隨著時間的推移,這些技能的提升使您能夠在日常工作中脫穎而出。然而,有時候我們可能陷入固定的編程模式,導(dǎo)致編碼習(xí)慣停滯不前。在這篇文章中,我們將介紹10個Java編程習(xí)慣,它們可以幫助您提高編碼技能,寫出更加干凈、健壯的Java代碼。jco28資訊網(wǎng)——每日最新資訊28at.com

1、調(diào)用equals()方法時使用String字面值或已知對象

這條肯定中!很多人以為由于equals()方法是對稱的,因此調(diào)用 a.equals(b) 與調(diào)用b.equals(a)相同的,所以習(xí)慣性的這樣寫:jco28資訊網(wǎng)——每日最新資訊28at.com

if (givenString.equals("YES")){    // 執(zhí)行一些操作}

盡管這種寫法在可讀性上有優(yōu)勢,但它并不安全。如果givenString為null,那么這段代碼將拋出NullPointerException。為了避免這種情況,我們應(yīng)該將equals方法調(diào)用放在已知對象的一側(cè),如下所示:jco28資訊網(wǎng)——每日最新資訊28at.com

"YES".equals(givenString)

這樣,如果givenString為null,它將返回false,而不會拋出異常。這是一種更加安全和健壯的編碼習(xí)慣,同時也是避免NullPointerException的一種流行方式。jco28資訊網(wǎng)——每日最新資訊28at.com

2、使用entrySet遍歷HashMap

在遍歷HashMap時,我們通常會使用鍵集合(key set)來獲取鍵,并通過鍵獲取對應(yīng)的值。例如:jco28資訊網(wǎng)——每日最新資訊28at.com

Set<Key> keySet = map.keySet();for (Key k : keySet){    Value v = map.get(k);    System.out.println(k + ": " + v);}

然而,這種方法需要進(jìn)行兩次查找操作,可能會導(dǎo)致性能下降。如果我們需要同時訪問鍵和值,更好的方式是使用entrySet,如下:jco28資訊網(wǎng)——每日最新資訊28at.com

Set<Map.Entry<Key, Value>> entrySet = map.entrySet();for (Map.Entry<Key, Value> entry : entrySet){    Key k = entry.getKey();    Value v = entry.getValue();    System.out.println(k + ": " + v);}

這種方式效率更高,因為它直接從entry對象中獲取值,而不需要再次查找。jco28資訊網(wǎng)——每日最新資訊28at.com

3、使用枚舉作為單例

想象一下,您需要創(chuàng)建一個線程安全的單例模式。以前,這可能需要大量的代碼和同步操作。但現(xiàn)在,您可以使用Java的枚舉類型,僅需一行代碼即可創(chuàng)建一個線程安全的單例:jco28資訊網(wǎng)——每日最新資訊28at.com

public enum Singleton{  INSTANCE;}

這個枚舉實例在多線程環(huán)境下也能保證只有一個實例存在,即使在序列化和反序列化過程中也是如此。這是一種簡潔而強(qiáng)大的單例模式的實現(xiàn)方式。jco28資訊網(wǎng)——每日最新資訊28at.com

4、使用Arrays.asList()或List.of()初始化集合

在Java中,初始化集合時,我們通常會逐個添加元素。例如:jco28資訊網(wǎng)——每日最新資訊28at.com

List<String> listOfCurrencies = new ArrayList<>();listOfCurrencies.add("USD/AUD");listOfCurrencies.add("USD/JPY");listOfCurrencies.add("USD/INR");

這種方法雖然有效,但相對繁瑣。您可以使用Arrays.asList()方法以更簡潔的方式初始化集合,如下:jco28資訊網(wǎng)——每日最新資訊28at.com

List<String> listOfPairs = new ArrayList<>(Arrays.asList("USD/AUD", "USD/JPY", "USD/INR"));

此外,從Java 9開始,您還可以使用List.of()和Set.of()方法來創(chuàng)建不可變的列表和集合。這些方法提供了更好的不可變性保證。jco28資訊網(wǎng)——每日最新資訊28at.com

List<String> newList = List.of("One", "Two", "Infinity");

5、在循環(huán)中檢查wait()條件

當(dāng)我們使用wait()、notify()和notifyAll()方法進(jìn)行多線程通信時,通常會在if語句中檢查等待條件,然后調(diào)用wait()。例如:jco28資訊網(wǎng)——每日最新資訊28at.com

synchronized(queue) {  if(queue.isFull()){    queue.wait();  }}

然而,這種寫法存在一個問題,即可能會發(fā)生虛假通知(spurious notification)。為了解決這個問題,我們應(yīng)該將檢查等待條件的操作放在一個while循環(huán)內(nèi),如下:jco28資訊網(wǎng)——每日最新資訊28at.com

synchronized(queue) {  while(queue.isFull()){    queue.wait();  }}

這樣,即使在通知之前等待條件再次被滿足,我們的代碼也可以正確地工作。jco28資訊網(wǎng)——每日最新資訊28at.com

6、捕獲CloneNotSupportedException并返回子類實例

在Java中,對象克隆的實現(xiàn)機(jī)制常常受到批評,因為它的性能不佳。如果您需要實現(xiàn)clone()方法,可以使用以下習(xí)慣來減輕這種痛苦:jco28資訊網(wǎng)——每日最新資訊28at.com

public Course clone() {   Course c = null;   try {     c = (Course)super.clone();   } catch (CloneNotSupportedException e) {} // 不會發(fā)生   return c;}

這個習(xí)慣利用了clone()方法實際上不會拋出CloneNotSupportedException的事實,只要類實現(xiàn)了Cloneable接口。這種方式返回了子類的實例,被稱為協(xié)變方法覆蓋(covariant method overriding),從Java 5開始支持。這可以減少客戶端代碼中的類型強(qiáng)制轉(zhuǎn)換,使代碼更加清晰。jco28資訊網(wǎng)——每日最新資訊28at.com

7、在可能的情況下使用接口

在定義方法的返回類型、變量類型或方法參數(shù)類型時,應(yīng)盡量使用接口而不是具體jco28資訊網(wǎng)——每日最新資訊28at.com

的類。例如,不要這樣寫:jco28資訊網(wǎng)——每日最新資訊28at.com

ArrayList<Integer> listOfNumbers = new ArrayList<>();public ArrayList<Integer> getNumbers(){    return listOfNumbers;}public void setNumbers(ArrayList<Integer> numbers){    listOfNumbers = numbers;}

而應(yīng)該這樣寫:jco28資訊網(wǎng)——每日最新資訊28at.com

List<Integer> listOfNumbers;public List<Integer> getNumbers(){    return listOfNumbers;}public void setNumbers(List<Integer> numbers){    listOfNumbers = numbers;}

這種方式提供了更大的靈活性,可以傳遞不同的集合實現(xiàn)。您還可以使用泛型中的通配符擴(kuò)展功能,進(jìn)一步提高靈活性。jco28資訊網(wǎng)——每日最新資訊28at.com

public void processList(List<? extends Number> numbers){    // 執(zhí)行操作}

8、使用迭代器遍歷List

在Java中,有多種遍歷List的方法,包括使用索引的for循環(huán)、增強(qiáng)的for循環(huán)和迭代器。最佳實踐是使用迭代器,因為它是一種安全且能夠防止不可預(yù)測行為的方法:jco28資訊網(wǎng)——每日最新資訊28at.com

Iterator<String> iterator = list.iterator();while(iterator.hasNext()){    String name = iterator.next();    // 執(zhí)行操作}

使用迭代器的好處包括能夠遍歷不同實現(xiàn)的List,例如ArrayList和LinkedList,同時避免了多線程環(huán)境下的問題。jco28資訊網(wǎng)——每日最新資訊28at.com

9、在編寫代碼時考慮依賴注入

在以前的編程實踐中,我們常常會硬編碼依賴關(guān)系,例如:jco28資訊網(wǎng)——每日最新資訊28at.com

public Game {    private HighScoreService service = HighScoreService.getInstance();    public void showLeaderBoard(){        List<Player> listOfTopPlayers = service.getLeaderBoard();        System.out.println(listOfTopPlayers);    }}

這種方式使Game類與HighScoreService類緊密耦合,不容易進(jìn)行單元測試,因為必須使用HighScoreService的實際實現(xiàn)。為了避免這個問題,我們應(yīng)該使用依賴注入,將依賴作為構(gòu)造函數(shù)參數(shù)傳遞:jco28資訊網(wǎng)——每日最新資訊28at.com

public Game {    private HighScoreService service;    public Game(HighScoreService service){        this.service = service;    }    public void showLeaderBoard(){        List<Player> listOfTopPlayers = service.getLeaderBoard();        System.out.println(listOfTopPlayers);    }}

這種方式使代碼更加可測試,可以輕松地使用模擬對象進(jìn)行測試。jco28資訊網(wǎng)——每日最新資訊28at.com

10、在它們自己的try塊中關(guān)閉流

在處理輸入流和輸出流時,我們經(jīng)常需要進(jìn)行異常處理和關(guān)閉操作。以前,我們可能會這樣寫:jco28資訊網(wǎng)——每日最新資訊28at.com

InputStream is = null;OutputStream os = null;try {     is = new FileInputStream("application.json");    os = new FileOutputStream("application.log");} catch (IOException io) {} finally {    is.close();     os.close();}

然而,這種方式存在一個問題,如果第一個流的操作拋出異常,第二個流將永遠(yuǎn)不會被關(guān)閉。為了解決這個問題,我們可以使用Java 7引入的try-with-resources語法,更加簡潔地處理流的關(guān)閉操作:jco28資訊網(wǎng)——每日最新資訊28at.com

try (InputStream is = new FileInputStream("application.json");     OutputStream os = new FileOutputStream("application.log")) {    // 讀取輸入流并寫入輸出流的操作} catch (IOException e) {    // 異常處理代碼}

使用try-with-resources后,不需要再手動關(guān)閉流,它們會在try塊結(jié)束時自動關(guān)閉。這樣的寫法更加簡潔和安全。jco28資訊網(wǎng)——每日最新資訊28at.com

結(jié)語

這些Java編程習(xí)慣可以幫助您寫出更加高效、健壯的Java代碼,提高編碼技能。如果您是剛剛開始學(xué)習(xí)Java或已經(jīng)有一到兩年的經(jīng)驗,這些習(xí)慣將為您打開Java編程的新視角。隨著Java版本的不斷更新,一些習(xí)慣可能會被更好的API方法所取代,但掌握它們?nèi)匀槐炔徽莆崭谩H绻€知道或遵循其他Java編程習(xí)慣,歡迎在評論中分享,我們期待從有經(jīng)驗的讀者那里學(xué)習(xí)。希望這些習(xí)慣對您的Java編程之旅有所幫助。jco28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-22475-0.html99%的Java程序員都會寫這樣的垃圾代碼

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 五個提高Java代碼安全性的VS Code插件

下一篇: Python開發(fā)者的寶典:CSV和JSON數(shù)據(jù)處理技巧大公開!

標(biāo)簽:
  • 熱門焦點
  • MIX Fold3包裝盒泄露 新機(jī)本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發(fā)布,近日該機(jī)的真機(jī)包裝盒在網(wǎng)上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設(shè)計方面延續(xù)了之前的方案,變化不大,這也是目前小米旗艦
  • 5月安卓手機(jī)好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機(jī)好評榜,數(shù)據(jù)來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內(nèi)市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 多線程開發(fā)帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結(jié)束訪問某一數(shù)據(jù)期間,該數(shù)據(jù)被其他的線程所修改,那么對于當(dāng)前線程而言,該線程
  • JVM優(yōu)化:實戰(zhàn)OutOfMemoryError異常

    一、Java堆溢出堆內(nèi)存中主要存放對象、數(shù)組等,只要不斷地創(chuàng)建這些對象,并且保證 GC Roots 到對象之間有可達(dá)路徑來避免垃 圾收集回收機(jī)制清除這些對象,當(dāng)這些對象所占空間超過
  • 中國家電海外掘金正當(dāng)時|出海專題

    作者|吳南南編輯|胡展嘉運(yùn)營|陳佳慧出品|零態(tài)LT(ID:LingTai_LT)2023年,出海市場戰(zhàn)況空前,中國創(chuàng)業(yè)者在海外紛紛摩拳擦掌,以期能夠把中國的商業(yè)模式、創(chuàng)業(yè)理念、戰(zhàn)略打法輸出海外,他們依
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • iQOO Neo8 Pro搶先上架:首發(fā)天璣9200+ 安卓性能之王

    經(jīng)過了一段時間的密集爆料,昨日iQOO官方如期對外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級性能調(diào)校的作品。隨著發(fā)布時
  • 質(zhì)感不錯!OPPO K11渲染圖曝光:旗艦IMX890傳感器首次下放

    一直以來,OPPO K系列機(jī)型都保持著較為均衡的產(chǎn)品體驗,歷來都是2K價位的明星機(jī)型,去年推出的OPPO K10和OPPO K10 Pro兩款機(jī)型憑借各自的出色配置,堪稱有
  • OPPO Reno10 Pro英雄聯(lián)盟定制禮盒公布:薩勒芬妮同款配色夢幻十足

    5月24日,OPPO推出了全新的OPPO Reno 10系列,包含OPPO Reno10、OPPO Reno10 Pro和OPPO Reno10 Pro+三款新機(jī),全系標(biāo)配了超光影長焦鏡頭,是迄今為止拍照
Top 主站蜘蛛池模板: 外汇| 临海市| 丰原市| 海盐县| 巫溪县| 汉寿县| 河南省| 武安市| 达孜县| 天峻县| 平和县| 抚松县| 丰镇市| 拜城县| 丽江市| 阜阳市| 团风县| 巧家县| 宁蒗| 凌源市| 南安市| 柳江县| 武定县| 伊金霍洛旗| 永年县| 磐石市| 英吉沙县| 富阳市| 松溪县| 句容市| 乌拉特中旗| 家居| 武穴市| 通化市| 周至县| 合肥市| 鄂温| 广饶县| 西盟| 阿鲁科尔沁旗| 绵竹市|