2010-10-12 83 views
3

我有問題試圖得到我希望的結果。基本上我想要做的是有一個布爾對象,這將允許我有3個選擇,如果郵件是舊的,我希望它被設置爲false(意思是不包含「mapQ.cmd」和「add-coid.cmd 「文件)使用布爾對象

如果郵件程序是新的,我希望它設置爲true(如果它是新的,它將在目錄中包含」mapQ.cmd「和」add-coid.cmd「文件),如果它是既不是舊的或新的郵件程序(意味着不是郵件程序),那麼我希望它是空的。

這就是我所擁有的,我想放置一個elseif而不是else,然後在裏面設置空值,這意味着非上述值,然後我希望返回布爾值。 局部積聚deploy.cmd在實施例中使用,但我希望使用上述文件名

private boolean isOldMailer(File mailerFolder) { 
    File localBuildAndDeploy = new File(mailerFolder,"test/local-build-deploy.cmd"); 
    if (localBuildAndDeploy.exists()) { 
     return true; 
    } else { 
     return false; 
    } 
} 

回答

5

有兩種方法可以做到這一點。

如果您堅持使用布爾值,請使用大寫B版本而不是小寫字母b。大寫字母B布爾值是一個對象,可以設置爲null並執行您所描述的內容。小寫字母b布爾值是一個基元,不能設置爲空。

然而,當它是專爲2

不依賴於使用一個布爾值3點的值將enum,你可以定義你的類型,你是多麼希望他們和到底有沒有更好的辦法儘可能多的你需要。這裏是一個例子,你將如何使用它。

public enum Status { NEW, OLD, NEITHER } 

private Status isOldMailer(File mailerFolder) { 
    File localBuildAndDeploy = new File(mailerFolder,"test/local-build-deploy.cmd"); 
    if (localBuildAndDeploy.exists()) 
     return Status.NEW; 
    else if (/*Something else*/) 
     return Status.OLD 
    else 
     return Status.NEITHER; 
} 
+0

對不起,因爲你可以告訴我是新來的java,這是我迄今爲止。 – OakvilleWork 2010-10-12 19:36:04

+0

public class MailerType { private boolean isOldMailer(File mailerFolder){ File localBuildAndDeploy = new File(mailerFolder,「test/local-build-deploy.cmd」);如果(localBuildAndDeploy.exists()){ }返回true; } else if { return false; {else } } } – OakvilleWork 2010-10-12 19:36:52

+0

我更新了這個版本以處理您的代碼。您只需填寫每個值的確切條件即可。 – 2010-10-12 19:54:12

1

這是三值邏輯,而不是二進制邏輯。它通常用於關係數據庫。

布爾是二元的,當然 - 只是真或假。

如果你想要三元邏輯,將它包裝在你自己的類型中。

-1

使用Boolean - 原始布爾值上的包裝器對象。這樣,您可以將引用設置爲null或true或false。

+0

Shamik - 每個開發人員都希望布爾值爲true或false。即使是自動拆箱的語言也會這樣認爲。非常不幸的是,null是一個技術上可能的價值。我絕不會在公共API中將其用作_expected_行爲。 – extraneon 2010-10-12 19:58:20

+0

我同意這是醜陋的做法。 – Shamik 2010-10-12 20:40:43

1

(我會去三個常見的選項,然後建議第三個)。

第一個選項是使用布爾值並將其設置爲true,false或null。這有幾個好處:

  1. 假設您首先檢查以確保該值不爲空,則可以直接在布爾表達式中使用它。
  2. 這是一個有點爭議的問題,但是null與「沒有任何可能的值」(,即既非真也非假)沒有太大關係,所以這是一個合理的模型。 很多人不同意
  3. 簡明。

然而,一些人來說,合理與否,期待一個布爾值來爲真或假的,並沒有考慮空可能性,它可以容易導致錯誤

第二個選項是使用枚舉

  1. 濫用沒有真正的風險,因爲空是不是一種選擇,但...
  2. 你失去的布爾語義
  3. 根據你的建模,它可能或不可能是審美引入自定義枚舉。

第三 - 與建議 - 選擇是使用可選<布爾>Google's excellent Guava library

  1. 這是一個很常見的庫。
  2. 這是自我記錄。
  3. 它有well-defined semantics
  4. 空不是問題。
  5. 布爾語義只是一個得到了。
  6. 在上面的第一個選項中轉換爲基於空值的模型是veryconcise且易於閱讀。