1. 程式人生 > >StackOverflow 週報 - 第四周高質量問題的問答(Java、Python)

StackOverflow 週報 - 第四周高質量問題的問答(Java、Python)

這是 Stack Overflow 第三週週報,由於本週週四外出,所以只有三篇內容。兩篇 Java、一篇 Python。公眾號「渡碼」為日更,歡迎關注。

DAY1. 列舉物件 == 和 equals 區別

我們在比較列舉常量時可以使用 == 運算子或者 equals 方法,如:

 

先考慮第一個問題:為什麼可以用 == 判斷列舉常量相等?

我們都知道判斷物件的相等應該用 equals 方法,== 只是判斷物件的引用是否相等,列舉常量能夠使用 == 判斷相等是因為列舉常量除了定義時初始化的物件外,沒有其他例項。例如:常量 APPLE 在定義時已經初始化,並且執行時不會再有其他的 APPLE 列舉常量。根據 JLS 文件,Java 通過以下四點保證列舉常量不存在定義之外的例項

  • 試圖顯式例項化列舉型別是編譯時錯誤,例如:new FRUITS()
  • Enum 類中的 clone 方法確保永遠不能克隆Enum常量,看看 clone 方法可以看到直接丟擲 CloneNotSupportedException 異常
  • 序列化機制的特殊處理確保不會因為反序列化而建立重複的例項
  • 禁止列舉型別的反射例項化

因為列舉常量只有一個例項,因此可以直接用 == 判斷列舉例項的相等。如果我們看下 equals 原始碼就可以發現它也是用 == 進行判斷,所以我們考慮第二個問題:使用 == 和 equals 的區別是什麼?

  • == 不會丟擲 NullPointerException 異常, 而 equals 會
  • == 的型別不匹配在編譯時檢查,而 equals 不檢查

因此使用 == 相比 equals 有以下優勢:

  • 更快
  • 執行時更安全
  • 編譯時更安全

參考:

https://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals

https://docs.oracle.com/javase/specs/jls/se9/html/jls-8.html#jls-8.9

DAY2. 用 Python 複製檔案

我們都知道 Python 庫非常強大,通常我們想實現一個功能基本都找到現成的庫。今天我們就介紹 Python 標準庫中的一個模組 —— shutil ,該模組中定義了檔案複製的方法。如:複製一個檔案,直接調一個函式即可

除了該函式, shutil 模組還定義了其他的函式提供檔案複製的功能,但是細節略有不同,對比如下:

其中 copy2 複製的比較全面,估計效能也是比較低的。下面簡單舉兩個例子對比一下不同函式的區別。

1. 目的路徑是否是目錄,copyfile vs copy2

2. 是否能複製 meta 資料,copyfile vs copy2

 

檢視檔案的 meta 資訊,copyfile 複製的檔案的更新時間是最新的, 而 copy2 複製的檔案更新時間與原始檔一樣。

這裡只舉這兩個例子,如對其他函式感興趣可自行嘗試。另外,shutil 模組應該還有其他更方便的函式可以供我們使用。總之使用 Python 開發效率還是挺高的,掌握 Python 確實能提高工作效率。

參考:

https://stackoverflow.com/questions/123198/how-do-i-copy-a-file-in-python

DAY3. 什麼是 Java Bean

從學 Java web 開發起,我們就知道有 Java Bean 這個東西。但對於我來說,因為我畢業後一直做大資料,講真我確實不知道 Java Bean 的正式定義。下面我們一起看看符合什麼要求才叫 Java Bean :
  • 所有的屬性是 private,提供 getter 和 setter 設定屬性
  • 有一個 public 無參建構函式
  • 實現 Serializable 介面

Java Bean 其實是一種規範。對於我們學知識來說,往往想問為什麼 Java Bean 定義這樣的規範。對照上面三點,我的思考是這樣的:

  • getter/setter 方法為了對外暴露屬性的讀寫介面,方便框架呼叫。同時,屬性用 private 修飾可以提高安全性
  • 之前的文章看過 Hadoop 框架反射的例子, public 無參構造可以很方便框架通過反射建立類例項
  • 由於 web 框架通常需要資料傳輸,因此需要物件具有序列化與反序列化的能力

我們今天這篇文章比較簡短,只是簡單介紹了一下 Java Bean 規範的定義,並且談了談我自己的一些思考。

參考:

https://stackoverflow.com/questions/3295496/what-is-a-javabean-exactly

以上便是 Stack Overflow 的第四周週報,這周外出沒帶原始檔, 程式碼從公眾號複製的圖片,請見諒。希望這些內容對你有用,後續會繼續更新,如果想看日更內容歡迎關注公眾號。

公眾號「渡碼」,分享更多高質量內容