java - 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,用逻辑补码运算符替换布尔值反转的三元(为了保持一致性)。
解决方案
您的第一个实现(ImpureToggle)看起来不错。只需将切换方法更改为:
state = !state
但是拥有这样一个带有公共切换方法的切换器看起来有点矫枉过正。要么使用具有适当访问修饰符的整个类,要么使用本地方法来限制范围和潜在的错误。
推荐阅读
- python - reportlab.pdfbase.ttfonts.TTFError: Can't open file "Times New Roman.ttf"
- ruby-on-rails - 保存从footer.html.rb rails点击按钮的输入
- r - 从一个累积序列中,如何得到原始序列?
- c# - 从 C# 执行 UiPath 活动会导致空指针异常
- javascript - Javascript - 将输入中的值动态添加到 GET url
- java - jar 未加载启用 java.security.manager
- shiny - 错误:“闭包”类型的对象不是子集
- jasper-reports - 使用 jasper 报告每页生成一个 pdf
- java - 短信管理器不工作。我还在清单中包含了权限
- tkinter - 从 Turtle 翻译成 Tkinter,绘制摩洛哥马赛克