2015-10-14 367 views
3

考虑一个类需要维护其启用的用例:在两个显式方法(启用/禁用)中隔离行为的优点是什么,而不是只有一个设置器,我应该在什么时候执行?实现类启用

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

第二个选项看起来像一个有效的方法,恕我直言。 –

+4

第一个版本比较好,但是命名为'setEnabled(boolean enabled)'会更有意义 – erosb

+2

1.第一种方法就像是切换变量的状态,其中方法是精确启用或禁用布尔的状态 –

回答

-1

我认为这是一个更好,更自然的方式:

private boolean enabled = false; 

public boolean isEnabled() { 
    return enabled; 
} 

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

我会调用变量'enabled'和setter'setEnabled'。这比“isEnabled”作为变量名更有意义。 –

+0

我同意@OlivierGrégoire的观点 –

+0

@OlivierGrégoire你是对的。我编辑过。 –

-2

你实际上是在做同样的thing.In我看来,他第二个选项是更好,因为你可以启用/禁用方法,你want.You检查变量标志,你可以看到你的现有方法是否已经启用。

+0

*“您可以启用/禁用您想要的方法”*您如何启用/禁用某种方法?你也可以用第一种方法检查变量。 – fabian

-1

我要说的第二个作为方法名被更明确地描述的动作,而首先是有点暧昧。

对这种标志的通常的Java模式(虽然我觉得这种风格/惯例可外出时尚的 - 将是有趣的,如果有人更了解可以给一些这方面的见解)是使用isEnabledsetEnabled(),这是比第一个更明确的,但在代码减少冗余:

private boolean isEnabled; 

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

我也建议制作方法​​,因为他们随后将是线程安全的;机体将以原子方式执行,确保在进入国旗时没有任何恶劣的竞赛条件。

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

+0

如果你使用'AtomicBoolean',你必须使用对象的'set'和'get'方法。您不能将布尔值分配给AtomicBoolean对象引用(AutoBoxing仅适用于布尔封装类)。 –

+0

啊,我认为自动装箱也会应用于'布尔'的子类。谢谢,@DavidSN,我现在就改变它。 –

+1

'AtomicBoolean'不是'Boolean'的子类。所有原始类型的包装类都是final的,所以它们不能被子类化。 –