簡體   English   中英

如何鍵入安全檢查布爾值的相等性?

[英]How to typesafe check equality of booleans?

public class ComplexObject {
    private boolean isA, isB;
}

//custom comparator
public boolean checkComplexObject(ComplexObject o1, ComplexObject o2) {
   return o1.getIsA() == o2.getIsB();
}

現在,例如,當我將ComplexObject的數據類型從boolean更改為String ,比較器不會中斷,也不會注意到以后我會比較Strings而不是booleans,從而得到不同的結果。

問題:如何比較布爾類型安全的布爾型安全性,以便在更改字段的數據類型時出現編譯錯誤?

您可以做的一件非常簡單的事情是放入多余的演員表:

return (boolean)o1.getIsA() == (boolean)o2.getIsB();

您還可以定義僅接受boolean的方法:

static boolean booleanEquals(boolean a, boolean b) {
    return a == b;
}

然后調用booleanEquals而不是使用==


附帶說明一下,這種編程對我來說似乎過於防御。

您可以做一些事情,但是所有這些都會使您的代碼可讀性降低,因此,我建議您不要這樣做。

例如 :

return o1.getIsA() ^ o2.getIsB() == false;

要么

return (o1.getIsA() && o2.getIsB()) ||  (!o1.getIsA() && !o2.getIsB());

您可以為此使用XOR:

return o1.getIsA() ^ o2.getIsB();

更好的問題是, 為什么要這么做?

如果將屬性從boolean重構(很好,要進行大量更改)到String ,則應始終檢查受影響的代碼。 如果您需要通用的代碼變通方法(雙重檢查),則可能會在整個應用程序中引入過於復雜的代碼。

如果您知道該問題,為什么不直接在受影響的類屬性上添加注釋,以使其可以用==進行比較。 如果您以后想要或另一個開發人員想要更改其類型,則會收到警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM