重构Java中相互排斥的布尔值

时间:2018-10-03 10:45:48

标签: java enums int boolean refactoring

让我们说“我们”有一些布尔标志,这些标志指示应用在任何给定时间的行为……从触摸的处理方式到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并为其分配十六进制常量。

1 个答案:

答案 0 :(得分:1)

您应该阅读有关Strategy OOP模式的信息,该模式用于类似的情况。 这是一些有用的链接:

enter image description here

wiki

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