在我的代碼中,我正在評估3個布爾值。
這些布爾值真值的每種組合都需要不同的操作(例如,應執行不同的方法)。
目前我正在使用if-else塊(8個選項,不是很好)。 我想知道是否有另外的選擇來編寫這個代碼,使它更漂亮。
也許設計模式?
有人有想法嗎?帶動作的真值表
帶動作的真值表
回答
我建議你使用command pattern。
public interface Command {
void exec();
}
public class CommandA() implements Command {
void exec() {
// ...
}
}
建立一個Map對象,並用命令實例來填充它:
然後,你可以做這樣的事情在你通過迭代在地圖上。
commandMap.get(value).exec();
使用一個開關塊
switch ((A?4:0) + (B?2:0) + (C?1:0)){
case 0: //A,B,C false
break;
case 3: //A False, B,C true
break;
case 4: //A True, B,C false
break;
}
也可以在掩碼保存Bolean值是這樣的: 100, 010, 011, ... ,然後在這個變量簡單的使用開關。 – gkiko 2013-03-28 09:15:56
如果任何有許多方法,如可能組合,你可以在不同的方法入口處檢查組合:
public void a(boolean a, boolean b, boolean c) {
if (a && !b && !c) {
}
}
public void ab(boolean a, boolean b, boolean c) {
if (a && b && !c) {
}
}
public void abc(boolean a, boolean b, boolean c) {
if (a && b && c) {
}
}
public void ac(boolean a, boolean b, boolean c) {
if (a && !b && c) {
}
}
public void b(boolean a, boolean b, boolean c) {
if (!a && b && !c) {
}
}
public void bc(boolean a, boolean b, boolean c) {
if (!a && b && c) {
}
}
public void c(boolean a, boolean b, boolean c) {
if (!a && !b && c) {
}
}
public void none(boolean a, boolean b, boolean c) {
if (!a && !b && !c) {
}
}
然後,只需調用所有的人:
a(a, b, c);
ab(a, b, c);
abc(a, b, c);
ac(a, b, c);
b(a, b, c);
bc(a, b, c);
c(a, b, c);
none(a, b, c);
三個元素不算太壞,但如果你的表格包含4或5或25呢?可能會變得複雜。 這裏有一個小巧的技術,有些會發現有用而有些會擊落。
建表元素的字符串:
final boolean a = false, b = false, c = false;
final String method = "state"+(a?"AT":"AF")+(b?"BT":"BF")+(c?"CT":"CF");
這將產生類似的字符串:
// stateAFBFCF
// stateAFBTCF
// stateAFBFCT
...
創建由相同的名稱的方法來處理狀態的每個組合:
public void stateAFBTCF() { }
public void stateAFBTCF() { }
public void stateAFBFCT() { }
...
使用反射來調用正確的方法:
final Class<?> _class = handler.getClass();
final Method _method = _class.getDeclaredMethod(methodName, new Class[] {});
_method.invoke(handler, new Object[] { });
好主意,唯一的缺點是方法存在檢查是在運行時完成的。 – 2013-03-28 11:10:37
@LefterisE - 同意,儘管有些人可能更喜歡運行時異常,而不是編碼所有的條件檢查程序。 getDeclaredMethod()中的try/catch可以減少臉上的一巴掌。 – Java42 2013-03-28 11:48:32
- 1. 帶有通配符的真值表(ish)
- 2. 真值表
- 3. 真值表VHDL
- 4. 休眠@DynamicUpdate(值=真)@SelectBeforeUpdate(值=真)表現
- 5. 帶動作的動態下拉列表
- 6. 帶FK的真實數據表
- 7. 真值表陣列
- 8. 創建真值表
- 9. 帶有單獨動作值的Ajax表單
- 10. Javascript中的真值表
- 11. 帶動作的列表元素
- 12. 帶動作的PyQt4下拉列表
- 13. 證明論證真值表真/假
- 14. 表達式的真值表(字符串)
- 15. 錯誤真值表VHDL
- 16. 3D矩陣真值表
- 17. 真值表與/〜爲J
- 18. 表單動作帶我到基本URL
- 19. 值在java.lang.String類型的動作真不能轉換成JSONArray
- 20. 帶有靜態值和動態值的MYSQL表格
- 21. 用布爾操作生成整數的真值表
- 22. 蟒蛇建立一個動態增長的真值表
- 23. 「無」帶有值的列表?
- 24. 帶cte的表值函數
- 25. 帶構建動作的VSTemplate
- 26. 用多種表情創建真值表
- 27. Haskell中匿名函數的真值表
- 28. 生成真值表小數的公式
- 29. 實現真值表的一般模式
- 30. 製作一個帶有圖像的真正彎曲的容器
您可以將三個布爾值組合成0-7範圍內的整數並使用switch語句。 – Moshe 2013-03-28 09:11:27
你可以分享代碼..你到目前爲止嘗試過什麼? – 2013-03-28 09:11:32
在任何可能的情況下,你都應該優先考慮條件,所以你應該給代碼一個檢查的順序。 ü應該寫,如果的或開關/箱或類似的東西的邏輯 – Neron 2013-03-28 09:44:18