2010-04-04 150 views
0

當調整返回true/false的C風格函數到Java時,最佳實踐是什麼?調整返回true/false的方法

下面是一個簡單的方法來說明問題所在。

public static boolean fileNameEndsWithExtension(String filename, String fileExtension) { 
    return filename.endsWith(fileExtension); 
} 

請注意,有可能是一種更優雅的過濾文件的方式(隨意對此進行評論)。無論如何,如果文件名是null值,是否有:

  1. 如果文件名爲空,返回false?如果是這樣,那麼如何區分文件名爲null的情況和String或文件名不以給定文件擴展名結尾的情況?
  2. 將返回類型更改爲允許值爲null的包裝類Boolean。
  3. 拋出一個Exception並強制程序員確保一個null值永遠不會傳遞給該方法?
  4. 使用另一種解決方案?
+1

見http://stackoverflow.com/questions/135845/are-booleans-as-method-arguments-unacceptable/135871#135871一個可能的選項(4) – skaffman 2010-04-04 21:54:35

+0

謝謝skaffman。 – 2010-04-04 23:10:30

回答

7

如果文件名爲空,則應該拋出NullPointerException或IllegalArgumentException。我會讓你決定哪一個最好。有一個很好的辯論在這個問題上使用:IllegalArgumentException or NullPointerException for a null parameter?

+1

+1當然,如果你只是保持原樣,你將會得到一個合適的'NullPointerException';我可能不會再打擾了。選項1和選項2是可怕的,因爲它們會將錯誤推遲到稍後可能難以調試的點。 – bobince 2010-04-04 22:20:43

+1

關於NPE與IAE:我會推薦NPE,因爲它通過標準庫被廣泛使用來表明參數是非法'null'。 Java 7甚至會引入'java.util.Objects',它將具有用於單行反空檢查和賦值的實用程序方法(如果參數爲空,則提供NPE)。 NPE已經成爲實現這一目標的方式。相關的RFE:http://bugs.sun.com/view_bug.do?bug_id=6889858 – gustafc 2010-04-04 22:55:11

+0

很高興聽到。這將節省一個實用方法來檢查空值。 – 2010-04-04 23:24:23

3

你做什麼,在你的特定應用程序的問題域是有道理的:

  1. 如果它是有道理的說,空集的文件名與任何擴展名結尾,返回true。
  2. 如果說空白的文件名集沒有擴展名是有意義的,則返回false。
  3. 如果說任何人都不應該問這個問題,讓代碼拋出是有道理的。
  4. 如果三值結果有意義,那麼可以使用布爾值。
  5. 或者創建一個三值枚舉並從THAT返回。

大多數情況下,選項3將是明智的,但這裏沒有人可以排除其他人對您的應用程序的適用性。如果您爲了一個很好的理由而傳遞了大量有意義的空文件名,那麼選擇其中一個可能是有意義的。

2

我會使用1或3.最好我會拋出NullPointerExceptions或至少使用assert

返回可爲空的布爾值通常會導致比他們的值更多的麻煩,您檢查是否有空值等。除了fileNameEndsWithExtension()看起來像只在知道您具有有效文件名時纔會使用的函數。

另外不要忘記fileExtension也可能是null。

1
  1. 返回true IFF文件名。endsWith(fileExtension)

如果文件名爲空,並且不打擾null和任何其他非匹配值之間的區別,我會返回false。

如果null文件名是需要驗證和明確處理的獨特狀態,那麼應該單獨驗證,最好在檢查endsWith()之前進行驗證,但仍在endsWith()中保留null檢查以防止不必要的運行時異常。

我選擇null = false行爲的原因可能是由於關係數據庫的影響。以下查詢將只返回符合條件的行,其他所有內容(空值和不匹配)將被忽略。

select * from filenames 
where filename like '&fileExtension'; 
+0

我明白這是我以前習慣的理由。順便說一句,帶有JQL/JPA/Hibernate的getResult()也會返回一個空值(通常分配給一個List)。 – 2010-04-04 23:23:02