【Java】程式碼重構時,為什麼禁止在方法內對物件型別的入參賦值

恆生LIGHT雲社群發表於2021-12-03

作者:幻好

來源: 恆生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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章