对于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,用逻辑补运算符替换了用于反转布尔值的编辑三元(为保持一致性而完成)。
发布于 2018-07-22 10:36:42
您的第一个实现(ImpureToggle)看起来不错。只需将切换方法更改为:
state = !state
但是,拥有这样一个具有公共切换方法的切换器看起来有点夸张。要么使用带有适当访问修饰符的整个类,要么使用本地方法来限制范围和潜在的bug。
https://stackoverflow.com/questions/51461240
复制相似问题