【Java】程式碼重構時,為什麼禁止在方法內對物件型別的入參賦值
作者:幻好
來源: 恆生LIGHT雲社群
引言
在專案程式碼重構過程中,程式碼規範中提到:
禁止在方法內對物件型別的入參賦值(簡單型別和string型別的入參允許賦值)
。那麼大多數初學者會有疑問,這個規範提出的主要意義是什麼呢?本文就來探究這個規範背後的目的。
引用傳遞和值傳遞
要想明白上述探究問題,首先得回去搞清楚 Java 基礎中的引用傳遞和值傳遞概念。
基本定義
值傳遞(pass by value):在呼叫函式時,將實際引數複製一份傳遞到函式中,如果在函式中對引數進行修改,就 不會影響到原來的 實際引數。
-
值傳遞的資料型別,包括基本資料型別和String 物件。
-
例項:
public static void main(String[] args) { int i = 1; String str = "值傳遞,不變"; passByValue(i, str); System.out.println("i 傳遞後 : " + i); System.out.println("str 傳遞後 : " + str); } public static void passByValue(int i, String str) { i = 0; str = "修改傳遞值"; System.out.println("i 傳遞值 : " + i); System.out.println("str 傳遞值 : " + str); } // 列印---------- i 傳遞值 : 0 str 傳遞值 : 修改傳遞值 i 傳遞後 : 1 str 傳遞後 : 值傳遞,不變
可以看出對於基本型別和String型別,值的傳遞後並不會改變原有的值。
引用傳遞(pass by reference):在呼叫函式時,將實際引數的地址直接傳遞到函式中,如果在函式中對引數進行的修改,就 會影響到 實際引數。
-
值傳遞的資料型別,包括陣列、類、介面。
-
例項:
public static void main(String[] args) { Map<String, String> map = new HashMap<>(8); map.put("desc", "引用傳遞,值會變嗎?"); passByRef(map); System.out.println("map 傳遞後 : " + map.toString()); } public static void passByRef(Map map) { map.put("desc", "修改引用傳遞"); System.out.println("map 傳遞值 : " + map.toString()); } // 列印--------- map 傳遞值 : {desc=修改引用傳遞} map 傳遞後 : {desc=修改引用傳遞}
根據列印值,如果是引用傳遞,傳遞後的原值已被修改。
所以透過以上兩個例子,可以明白 Java 中引用傳遞和值傳遞概念。
本質原因
由於 Java 程式設計語言是採用的值傳遞,所以在在 Java 中沒有指標的概念。也就是說方法得到的是所有引數值的一個複製,方法並不能修改傳遞給它的任何引數變數的內容。
基於上述設計原則,我們在開發中應該遵循此原則進行開發,更重要的一點是,如果修改傳參的值,會讓後期對程式的維護難度增加。
所以在開發中,我們更應該規範code,提高程式碼質量。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70001864/viewspace-2845633/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java程式設計——重構-你為什麼要對引數賦值?Java程式設計賦值
- 利用多型重構為帶參方法多型
- Linux系統把時間型別值轉換為數值型的方法是什麼?Linux型別
- 為什麼值型別不允許顯式定義無參建構函式型別函式
- .NET重構(型別碼的設計、重構方法)型別
- 禁止密碼框賦值黏貼程式碼密碼賦值
- Java重寫equals方法時為什麼要重寫hashcode方法Java
- 阿里為何禁止在物件中使用基本資料型別阿里物件資料型別
- 動態型別一時爽,程式碼重構火葬場?型別
- Java程式設計細節-重構-為什麼 if-else 不是好程式碼Java程式設計
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- 為什麼阿里巴巴禁止把SimpleDateFormat定義為static型別的?阿里ORM型別
- 為什麼在pyhton中不能用函式重新賦值函式賦值
- JavaScript 物件解構賦值JavaScript物件賦值
- 為什麼IT程式設計師都不願意重構程式碼?程式設計師
- JAVA 物件引用,以及物件賦值Java物件賦值
- js中為什麼值型別可以使用方法和屬性JS型別
- 動態賦值弱型別值物件--Dynamic Create Value Object 模式 (轉)賦值型別物件Object模式
- 程式語言模式:`=`表示賦值,`:`表示型別。模式賦值型別
- 關於程式碼重構的靈魂三問:是什麼?為什麼?怎麼做?
- javascript值型別是什麼JavaScript型別
- 在Java中建立物件的不同方法是什麼?Java物件
- 如何使用Java泛型對映不同的值型別Java泛型型別
- 從賦值看基本型別和引用型別的區別賦值型別
- 類似DDD的值物件的Java中新的值型別ValueType -jaxenter物件Java型別
- java裡面給物件賦值,慎用賦值符號(=) (轉)Java物件賦值符號
- Java中Short型別轉換為Int型別是如何計算的?原碼、反碼、補碼是什麼?Java型別
- Java 物件的雜湊值是每次 hashCode() 方法呼叫重計算麼?Java物件
- java 判斷字串什麼編碼型別Java字串型別
- 複習java面對物件(方法重寫)Java物件
- 程式碼重構之法——方法重構分析
- 為什麼基本型別可以呼叫方法——以字串為例型別字串
- 為什麼要重構?深入探討重構的原則、範圍和時機
- 在對齊 AI 時,為什麼線上方法總是優於離線方法?AI
- java為什麼要重寫hashCode和equals方法Java
- 你構建的程式碼為什麼這麼大
- 為什麼Javascript需要型別?JavaScript型別
- 參加Java開發培訓機構主要學什麼內容Java