没有单身的Java

时间:2009-05-07 08:31:00

标签: java design-patterns

仅仅是出于介入:如果静态变量被排除在外,你认为Java本来是一种更好的语言,有效地用单身取代单身人士吗? Definition here.

如果您这么认为:您能详细说明将其纳入语言的动机是什么?

6 个答案:

答案 0 :(得分:7)

您引用的同一篇文章有​​以下声明:

  

另一种半单可接受的单身人士是那些不影响你的代码执行的人,他们没有“副作用”

...然后文章解释了日志记录。另一个典型的例子是印刷。因此,即使在要求“让我们摆脱所有单身人士”的文章中,这也是单身人士的论据。

作者提供的论点很有意思。他说,拥有全球状态是Singletons的真正问题,只要你的程序与Singleton之间存在单向沟通,你就可以了。

如果没有静态变量,Java肯定会是一种更糟糕的语言,因为它是一个在几个用例中需要的功能。我的意思是,如果你真的想要的话,你可以用Java的程序方式编程......而且这本身并不邪恶。

滥用静态变量和单身人士并不一定意味着我们需要摆脱它们。

答案 1 :(得分:4)

  

如果静态变量是>那么你认为Java会是一种更好的语言吗?排除,有效地用单身取代单身人士?

不,有时你真的希望拥有所有对象共有的变量或常量。当然静态并非邪恶。

  

你能详细说明将它包括在内的动机可能是什么   语言

static 是对于数据不必要的对象或方法的简写,它模拟没有实例数据的行为。

答案 2 :(得分:2)

尽管鄙视单身人士和任何静态非法的人,我偶尔也会使用以下习语为对象生成唯一的ID。

private static long idCounter;
private synchronized static long getID() { return idCounter++; }
private final long id = getID();

这是静态非决定的一个论点。

(或者,正如Tom Hawtin指出的那样,稍好一点

private static final AtomicLong idCounter = new AtomicLong();
private final long id = idCounter.getAndIncrement();

答案 3 :(得分:2)

显然静态常量很有用。要在Java中使对象保持不变,请定义不可变类型。就目前而言,Java在常量类型方面有点缺乏。例如,通常会看到一个带有(非空)数组的静态字段,但(希望将其视为常量。

可变静力学有意义的情况相对较少。例如,一些缓存和向现有对象添加外部字段。类似地,即使常数String也有可变字段。

因此,完全摆脱静态对于通用语言来说有点困难。我相信Fan和Newspeak就是这样做的。

然而,普通的可变静态,无论是否打扮成单身人士,绝对是可以实现的。 API当然会有所不同。这会让我的工作变得更轻松。例如,SecurityManager机制将是多余的。

答案 4 :(得分:1)

我认为java是一种没有静态的更漂亮的语言,但我不认为通过删除关键字可以解决Singleton反模式。

单身人士是邪恶的,因为它'知道'它本身不应该的东西,即它是整个系统中它唯一的类型实例。每当这类信息被封装在一个类中时,你就会有一个事实上的Singleton。

至于它为什么用Java,我会推测,就像一系列事物一样,它是OO纯度和实用性之间的折衷。

答案 5 :(得分:0)

我同意DFA。有时静态是有道理的。

此外,它是一种语言功能,有人鄙视它可以选择不使用它。我发现静力学和单身人士很有用。