AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-11-13 09:06:41 286觀看
導讀在軟件開發領域,編程經驗往往與設計、編碼、重構和測試的能力相輔相成。隨著時間的推移,這些技能的提升使您能夠在日常工作中脫穎而出。然而,有時候我們可能陷入固定的編程模式,導致編碼習慣停滯不前。在這篇文章中,我們將

Ij828資訊網——每日最新資訊28at.com

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

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

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

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

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

"YES".equals(givenString)

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

2、使用entrySet遍歷HashMap

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

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

然而,這種方法需要進行兩次查找操作,可能會導致性能下降。如果我們需要同時訪問鍵和值,更好的方式是使用entrySet,如下:Ij828資訊網——每日最新資訊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對象中獲取值,而不需要再次查找。Ij828資訊網——每日最新資訊28at.com

3、使用枚舉作為單例

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

public enum Singleton{  INSTANCE;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在定義方法的返回類型、變量類型或方法參數類型時,應盡量使用接口而不是具體Ij828資訊網——每日最新資訊28at.com

的類。例如,不要這樣寫:Ij828資訊網——每日最新資訊28at.com

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

而應該這樣寫:Ij828資訊網——每日最新資訊28at.com

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

這種方式提供了更大的靈活性,可以傳遞不同的集合實現。您還可以使用泛型中的通配符擴展功能,進一步提高靈活性。Ij828資訊網——每日最新資訊28at.com

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

8、使用迭代器遍歷List

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

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

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

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

在以前的編程實踐中,我們常常會硬編碼依賴關系,例如:Ij828資訊網——每日最新資訊28at.com

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

這種方式使Game類與HighScoreService類緊密耦合,不容易進行單元測試,因為必須使用HighScoreService的實際實現。為了避免這個問題,我們應該使用依賴注入,將依賴作為構造函數參數傳遞:Ij828資訊網——每日最新資訊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);    }}

這種方式使代碼更加可測試,可以輕松地使用模擬對象進行測試。Ij828資訊網——每日最新資訊28at.com

10、在它們自己的try塊中關閉流

在處理輸入流和輸出流時,我們經常需要進行異常處理和關閉操作。以前,我們可能會這樣寫:Ij828資訊網——每日最新資訊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();}

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

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

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

結語

這些Java編程習慣可以幫助您寫出更加高效、健壯的Java代碼,提高編碼技能。如果您是剛剛開始學習Java或已經有一到兩年的經驗,這些習慣將為您打開Java編程的新視角。隨著Java版本的不斷更新,一些習慣可能會被更好的API方法所取代,但掌握它們仍然比不掌握更好。如果您還知道或遵循其他Java編程習慣,歡迎在評論中分享,我們期待從有經驗的讀者那里學習。希望這些習慣對您的Java編程之旅有所幫助。Ij828資訊網——每日最新資訊28at.com

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

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

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

下一篇: Python開發者的寶典:CSV和JSON數據處理技巧大公開!

標簽:
  • 熱門焦點
  • 六大權益!華為8月服務日開啟:手機免費貼膜、維修免人工費

    8月5日消息,一年一度的華為開發者大會2023(Together)日前在松山湖拉開帷幕,與此同時,華為8月服務日也式開啟,到店可享六大專屬權益。華為用戶可在華為商城Ap
  • 印度登月最關鍵一步!月船三號今晚進入環月軌道

    8月5日消息,據印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環月軌道。這是該探測器能夠成功的最關鍵步驟之一,如果成功將開始圍
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財經作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因為索尼在PS平臺上線《原神》,怒而
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 重估百度丨大模型,能撐起百度的“今天”嗎?

    自象限原創 作者|程心 羅輯2023年之前,對于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新業務到 2022 年底還是 0,希望 2023 年出來一個 1。&rdquo;這是2022年底,李彥宏
  • 世界人工智能大會國際日開幕式活動在世博展覽館開啟

    30日上午,世界人工智能大會國際日開幕式活動在世博展覽館開啟,聚集國際城市代表、重量級院士專家、國際創新企業代表,共同打造人工智能交流平臺。上海市副市
Top