[英]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.