实现类启用

时间:2015-10-14 10:30:01

标签: java design-patterns

考虑一个类需要维护它的用例:在两个显式方法中分离行为(启用/禁用)而不是只有一个setter以及何时应该这样做会有什么好处?

1:

private boolean enabled;

public void setEnabled(boolean enabled) {
    this.enabled = enabled;
}

2:

private boolean enabled;

public void enable() {
    enabled = true;
}

public void disable() {
    enabled = false;
}

3 个答案:

答案 0 :(得分:-1)

我认为有更好更自然的方式:

private boolean enabled = false;

public boolean isEnabled() {
    return enabled;
}

public void setEnabled(boolean enabled) {
    this.enabled = enabled;
}

答案 1 :(得分:-1)

我认为第二种方法名称更明确地描述了这个动作,而第一种方法有点含糊不清。

这种旗帜的常见Java模式(虽然我认为这种风格/惯例可能会逐渐消失 - 如果有更多知识渊博的人可以对此有所了解,那将会很有用)是使用isEnabledsetEnabled(),它比第一个更明确,但减少了代码中的冗余:

private boolean isEnabled;

private void setEnabled(boolean isEnabled) {
    this.isEnabled = isEnabled;
}

我还建议制作方法synchronized,因为它们将是线程安全的;身体将以原子方式执行,确保在访问旗帜时没有任何令人讨厌的竞争条件。

private boolean flag;

public synchronized void enable() {
    flag = true;
}

public synchronized void disable() {
    flag = false;
}

提供原子性的另一个选择是,对于需要访问变量的更复杂的方法更有用,是使用AtomicBoolean来强制其访问器方法中的原子性'实现:

private AtomicBoolean flag;

public void enable() {
    flag.set(true);
}

public void disable() {
    flag.set(false);
}

本Java教程中讨论了原子变量: http://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html

答案 2 :(得分:-2)

你实际上是在做同样的事情。在我看来,他的第二个选项更好,因为你可以启用/禁用你想要的方法。你检查变量标志,你可以看看你的现有方法是否已经启用。 / p>