首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中状态切换的最佳实现是什么?

在Java中状态切换的最佳实现是什么?
EN

Stack Overflow用户
提问于 2018-07-22 09:04:53
回答 1查看 724关注 0票数 -2

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

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

编辑这里的焦点是代码的结构。显然,实际的功能非常简单,甚至不需要专门的实现。

代码语言:javascript
复制
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;
    }
}

代码语言:javascript
复制
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;
    }
}

代码语言:javascript
复制
public interface ImpureStaticToggle {
    // reassigns parameter 'state'
    static <T> void toggle(T state, T a, T b) {
        state = state == a ? b : a;
    }
}

代码语言:javascript
复制
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;
    }
}

代码语言:javascript
复制
/*
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,用逻辑补运算符替换了用于反转布尔值的编辑三元(为保持一致性而完成)。

EN

回答 1

Stack Overflow用户

发布于 2018-07-22 10:36:42

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

state = !state

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51461240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档