首页 > 解决方案 > Java中状态切换的最佳实现是什么?

问题描述

Java中交替状态切换的最佳(就灵活性而言)面向对象的实现是什么?我列出的实现只是我想出的,并不详尽。

注意:这个问题的答案不是主观的。根据面向对象编程的原则,此实现的使用上下文应该是无关紧要的。

[编辑] 这里的重点是代码的结构。显然,实际功能是如此简单,甚至不值得专门实现的努力。


public class ImpureToggle<T> implements Supplier<T> {
    //false represents state a, true represents state b
    private boolean state;
    private final T a;
    private final T b;

    public ImpureToggle(T a, T b) {
        this.a = a;
        this.b = b;
    }

    // returns a different reference depending on internal state
    @Override
    public T get() {
        return state ? b : a;
    }
    public void toggle() {
        state = !state;
    }
}

public class ConsumerToggle<T> implements Consumer<Consumer<T>> {
    private final T a;
    private final T b;
    //false represents state a, true represents state b
    private boolean state;

    public ConsumerToggle(T a, T b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public void accept(Consumer<T> t) {
        t.accept(state ? b : a);
    }

    public void toggle() {
        state = !state;
    }
}

public interface ImpureStaticToggle {
    // reassigns parameter 'state'
    static <T> void toggle(T state, T a, T b) {
        state = state == a ? b : a;
    }
}

public interface PureStaticToggle {
    // returns a different reference depending exclusively on external input
    static <T> T toggle(boolean state, T a, T b) {
        //false represents state a, true represents state b
        return state ? b : a;
    }
}

/*
Just as an example of an unarguably bad implementation:
*/
public class MutableToggle<T> implements Supplier<T> {
    private T state;
    private final T a;
    private final T b;

    public MutableToggle(T a, T b) {
        state = a;
        this.a = a;
        this.b = b;
    }

    // exposes a mutable reference, which could completely break the logic of this
    // object and others
    @Override
    public T get() {
        return state;
    }

    public void toggle() {
        state = state == a ? b : a;
    }
}

[编辑] 根据@gargkshitiz,用逻辑补码运算符替换布尔值反转的三元(为了保持一致性)。

标签: javaoop

解决方案


您的第一个实现(ImpureToggle)看起来不错。只需将切换方法更改为:

state = !state

但是拥有这样一个带有公共切换方法的切换器看起来有点矫枉过正。要么使用具有适当访问修饰符的整个类,要么使用本地方法来限制范围和潜在的错误。


推荐阅读