【问题标题】:Refactoring mutually exclusive booleans in Java在 Java 中重构互斥布尔值
【发布时间】:2018-10-03 10:45:48
【问题描述】:

假设“我们”有一些布尔标志,它们指示应用在任何给定时间的行为方式......从如何处理触摸到 onPause() 中发生的情况。

boolean touchMode_BlockAllExceptCreateNew = false;
boolean touchMode_UserIsEditting = false;
boolean touchMode_Animation4IsTakingPlace = false;

可能这些小家伙的数量可能是无限的。 :)

这些“状态”是相互排斥的——一次只能或应该合法地发生一个。

那么……难道没有一些聪明的方法可以通过将它们组合成一个变量来强制实现这种互斥性吗?

使用枚举几乎是唯一的方法吗?像这样:

private enum TouchMode {
    flibbidyInProgress,
    deletePending,
    userIsEditting,
    jumpingJacks,
    recyclerViewIsOpen,
    normal // none
}

TouchMode currentTouchMode = TouchMode.normal;

private void changeTouchMode(TouchMode desiredTouchMode) {

    boolean undesirableCondition1 = (desiredTouchMode == currentTouchMode);
    boolean undesirableCondition2 = (desiredTouchMode != TouchMode.normal 
            && currentTouchMode != TouchMode.normal);

    if (undesirableCondition1 | undesirableCondition2) {
        Log.e("XXX", ">> ILLEGAL TOUCHMODE REQUEST! <<");
        Log.e("XXX", "requested: " + desiredTouchMode
                + ", current: " + currentTouchMode);
    } else {
        currentTouchMode = desiredTouchMode;
    }

}

我想我已经看到了一些巧妙的方法,将 'currentTouchMode' 设为 int 并为其分配十六进制常量。

【问题讨论】:

  • 你也可以看看State模式

标签: java enums int boolean refactoring


【解决方案1】:

您应该阅读Strategy OOP 模式,它用于类似的情况。 以下是一些有用的链接:

wiki

refactoring Guru

如果很快 - 您应该为每个 TouchMode(例如 AnimationTouchEditionTouch 等)创建具有通用接口和类特定实现的类层次结构。然后你应该通过你的通用界面使用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2018-06-18
    • 2014-02-25
    • 1970-01-01
    相关资源
    最近更新 更多