1. 程式人生 > >Java基礎學習總結(81)——如何儘可能的減少Java程式碼中bug

Java基礎學習總結(81)——如何儘可能的減少Java程式碼中bug

Java程式語言的人氣自然無需質疑,從Web應用到Android應用,這款語言已經被廣泛用於開發各類應用及程式碼中的複雜功能。

不過在編寫程式碼時,bug永遠是困擾每一位從業者的頭號難題。在今天的文章中,我們將分享五貢最佳實踐,希望幫助大家更為輕鬆地減少Java開發中的bug數量。

原則一:不要依賴初始化

在Java中,開發者常常依賴建構函式進行物件初始化。不過這其實是一種常見誤區。我們完全可以在無需呼叫建構函式的情況下,通過多種方式實現物件分配。

下面來看幾種常用方式:

• 大家可以將所有變數宣告為私有。要訪問該類外的物件,大家可使用GET與SET方法。

• 對每個物件,編寫一個新的私有boolean變數並對其進行初始化。

• 編寫一個非建構函式類,其將確保每個物件會在接受呼叫之前進行初始化。

原則二:保護類、方法與變數

在程式碼當中,類、方法與變數分為私有與公共兩類。私有類無法輕鬆進行訪問,這使其成為程式碼中的高安全性點。不過公共方法與變數則易於方法,也因此常常成為攻擊突破口。因此,請儘可能限制其範圍。

請記住,只在必要時開放類、方法與變數。

原則三:永遠對範圍進行預定義

大多數開發者完全依賴於軟體包自身的範圍設定,事實上我們應當堅持對程式碼範圍進行預定義。很多類本身並非完全封閉,這意味著攻擊者能夠對其施以攻擊。黑客可以利用單一漏洞插入自己的類,進而從程式碼中提取敏感資訊。JVM在預設情況下即不會封閉,不過允許大家在該軟體包內進行類封閉。

原則四:避免使用內部類

一般來講,開發者會在同一軟體包內其它類需要時使用內部類。這些內部類通常可供同一軟體包內全部類進行訪問,由此可能引發的問題在預定義程式碼範圍部分已經提到。因此,同樣請僅在必要時使用內部類。

原則五:確保類不可克隆

Java提供一項功能,用於在需要時對自有類進行克隆。然而這項功能往往被黑客所利用,其能夠使用java.lang.Cloneable從程式碼中複製程式碼例項並竊取必要資訊。

要解決這個問題,大家只需要在程式碼中的每個類中新增以下程式碼。

public final void clone()throws 
 
java.lang.CloneNotSupportedException 
{        thrownewjava.lang.CloneNotSupportedException();    } 

如果大家希望自己的class具備可克隆性,同時仍然儘可能避免安全問題,那麼則可自行定義克隆方法,並將其設定為final。

如果大家在自己的某個超類中使用了nonfinal克隆方法,則請按以下方式定義該方法:

public final void clone() 
 
throwsjava.lang.CloneNotSupportedException { 
 
    super.clone(); } 

當然,沒人能100%掌握Java的全部奧祕,但關注上述程式設計原則及實踐,能夠幫助大家更為有效地降低程式碼內bug數量。

相關推薦

Java基礎學習總結81——如何儘可能減少Java程式碼bug

Java程式語言的人氣自然無需質疑,從Web應用到Android應用,這款語言已經被廣泛用於開發各類應用及程式碼中的複雜功能。 不過在編寫程式碼時,bug永遠是困擾每一位從業者的頭號難題。在今天的文章

java基礎學習總結十三Java異常處理

一、JAVA異常       異常是指不期而至的各種情況,如:檔案找不到、網路連線失敗、非法引數等。異常是一個事件,它發生在程式執行期間,干擾了正常的指令流程。Java通過API中的Throwable類的眾多子類描述各種不同的異常。因而,Java異常都是物件,是Th

java基礎學習總結:可變長度引數以及foreach迴圈原理

一、語法糖        語法糖是一種幾乎每種語言或多或少都提供過的一些方便程式設計師開發程式碼的語法,它只是編譯器實現的一些小把戲罷了,編譯期間以特定的位元組碼或者特定的方式對這些語法做一些處理,開發者就可以直接方便地使用了。這些語法糖雖然不會提供實質性

java基礎學習總結:深入理解Java泛型

一、什麼是泛型         “泛型” 意味著編寫的程式碼可以被不同型別的物件所重用。泛型的提出是為了編寫重用性更好的程式碼。泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。 比如常見的集合類 LinkedList: publi

java基礎學習總結Java的反射

Native      JDK開放給使用者的原始碼中隨處可見Native方法,被Native關鍵字宣告的方法說明該方法不是以Java語言實現的,而是以本地語言實現的,Java可以直接拿來用。這裡有一個概念,就是本地語言,本地語言這四個字,個人理解應該就是可以和作業系

java基礎學習總結:Cloneable介面和Object的clone()方法

為什麼要克隆 為什麼要使用克隆,這其實反映的是一個很現實的問題,假如我們有一個物件: public class SimpleObject implements Cloneable { private String str; public SimpleObject()

Java基礎學習總結135——Java程式碼效能優化實踐經驗再總結

前言 程式碼優化的最重要的作用應該是:避免未知的錯誤。在程式碼上線執行的過程中,往往會出現很多我們意想不到的錯誤,因為線上環境和開發環境是非常不同的,錯誤定位到最後往往是一個非常小的原因。然而為了解決這個錯誤,我們需要先自驗證、再打包出待替換的class檔案、暫停業務並重啟,對於一個成熟的專

Java基礎學習總結136——有關流資源關閉try-with-resources與AutoCloseable的使用總結

前言 做Java開發的都知道,每個資源的開啟都需要對應的關閉操作,不然就會使資源一直佔用而造成資源浪費,從而降低系統性能。關於資源的關閉操作,從JDK7-JDK9有了不少的提升及簡化。我們來看看資源處理的變化。 一、JDK6 在JDK6及之前,每個資源都需要我們手動寫程

Java基礎學習總結131——專案開發真的有必要使用Lombok外掛麼?

一、Lombok是什麼 Lombok是一個可以通過簡單的註解形式來幫助我們簡化消除一些必須有但顯得很臃腫的Java程式碼的工具,通過使用對應的註解,可以在編譯原始碼的時候生成對應的方法。簡而言之,一句話就是:通過簡單的註解來精簡程式碼達到消除冗長程式碼的目的。Lombok提

Java基礎學習總結104——多執行緒、併發、工具類相關的面試題

執行緒的概念 執行緒是程式執行的最小單位,也是作業系統排程和分派CPU的最小單元,是程序中的一個實體,是程序中的實際運作單位。可以在一個程序中啟動多個執行緒來完成不同的任務,這些執行緒共享該程序擁有的資源。 執行緒程序區別 程序是程式的實體,也是執行緒的容器,一個程序可以包含多個執行緒,程序是資源分配的基本單

Java基礎學習總結122——Java八種基本資料型別的包裝類及其裝箱拆箱詳解

一、基本資料型別及對應的包裝類基本資料型別對應的包裝類byteByteshortShortintIntegerlongLongcharCharacterfloatFloatdoubleDoublebooleanBoolean每個包裝類的物件可以封裝一個相應的基本型別的資料,並提供了其它一些有用的方法。包裝類物

Java基礎學習總結119——Java8 JVM與Java7 JVM比較

jdk 7的jvm 記憶體分配,請看下圖:在JDK7以及其前期的JDK版本中,JVM空間可以分成三個大區,新生代、老年代、永久代。其中新生代可以劃分為三個區,Eden區,兩個倖存區。一個物件被建立以後首先被放到新生代中的Eden內存中,如果存活期超兩個Survivor之後就會

Java基礎學習總結114——System之系統變數和環境變數

環境變數這個概念不陌生,就是作業系統的環境變數。系統變數就是Java本身維護的變數。 通過 System.getProperty 的方式獲取。對於不同的作業系統來說, 環境變數的處理可能會有一些不統一

Java基礎學習總結70——開發Java專案常用的工具彙總

要想全面瞭解java開發工具,我們首先需要先了解一下java程式的開發過程,通過這個過程我們能夠了解到java開發都需要用到那些工具。 首先我們先了解完整專案開發過程,如圖所示: 從上圖中我們

java基礎學習總結二十五:logback詳解

為什麼使用logback logback大約有以下的一些優點: 核心重寫、測試充分、初始化記憶體載入更小,這一切讓logback效能和log4j相比有諸多倍的提升 logback非常自然地直接實現了slf4j,這個嚴格來說算不上優點,只是這樣,再理解slf4j的前提下會很容易理解

java基礎學習總結二十四:slf4j作用及其實現原理

簡單回顧門面模式 slf4j是門面模式的典型應用,因此在講slf4j前,我們先簡單回顧一下門面模式, 門面模式,其核心為外部與一個子系統的通訊必須通過一個統一的外觀物件進行,使得子系統更易於使用。用一張圖來表示門面模式的結構為:   門面模式的核心為Facade即門面

java基礎學習總結二十三:什麼要使用AOP

從最基礎的原始程式碼-->使用設計模式(裝飾器模式與代理)-->使用AOP三個層次來講解一下為什麼我們要使用AOP。 原始程式碼的寫法 既然要通過程式碼來演示,那必須要有例子,這裡我的例子為: 有一個介面Dao有insert、delete、update三個方法,在insert

java基礎學習總結二十二:Cglib及其基本使用

  Cglib是什麼           Cglib是一個強大的、高效能的程式碼生成包,它廣泛被許多AOP框架使用,為他們提供方法的攔截。下圖是我網上找到的一張Cglib與一些框架和語言的關係: 對此圖總結一下:

java基礎學習總結二十一:自己寫一個java.lang.reflect.Proxy代理的實現

     動態代理裡面用到了一個類就是java.lang.reflect.Proxy,這個類是根據代理內容為傳入的介面生成代理用的。本文就自己寫一個Proxy類出來,功能和java.lang.reflect.Proxy一樣,傳入介面、代理內容,生成代理。  

java基礎學習總結二十:多執行緒上下文切換

什麼是上下文切換        即使是單核CPU也支援多執行緒執行程式碼,CPU通過給每個執行緒分配CPU時間片來實現這個機制。時間片是CPU分配給各個執行緒的時間,因為時間片非常短,所以CPU通過不停地切換執行緒執行,讓我們感覺多個執行緒時同時執行的,時