回答
我看到它的方式,如果您认为单例实现使用对单个实例的引用static
,则只有“无语义差异”。事情是,static
只是实现单例的一种方式 - 它是一个实现细节。 You can implement singletons other ways, too.
虽然有差异。例如,您不能使用静态块来初始化前者。
该OP特别提到了“语义差异” - 显然,有(非?)语义差异,就像一个是静态的,另一个不是...... – 2012-01-12 00:43:53
当然可以。'static {instance = new Singleton(); }'。 – cHao 2012-01-12 00:44:54
我认为“前者”是指实例变量。 – 2012-01-12 00:46:38
也许最好是在单例中实现它,因为这样你可以重写单例测试和类似的。此外,你保持你的静态在一个地方。
真的没有区别(除了已经提到的初始化块)。但另一方面,你也没有真正获得任何东西。您仍然需要考虑线程安全性,您仍然需要确保一次只有一个单例实例。唯一的区别是如果你想通过公共静态方法发布该成员。但为什么你要这样做 - 我不知道。
对我个人而言,它也会有点“代码味道”。我的意思是有人做了一个单身人士,并且仍然将其成员声明为静态?它告诉我什么?有什么我不知道的吗?或者也许执行有问题,它必须是静态的(但为什么?!)。但我有点偏执。从我也意识到没有性能的原因,为什么这将是一个很好的选择。
我不确定你在找什么,所以我会写点东西,看看你有什么要说的。
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private double weight; // in pounds
private Elvis() { weight = 300.; } // inaccessible
public static Elvis getInstance() { return INSTANCE; }
public double getWeight() { return weight; }
public void setWeight(double weight) { this.weight = weight; }
}
由于只有一个猫王,你可以做出weight
一个静态变量(静态getter和setter)。如果你把所有的变量静态的,那么就定义一个Singleton实例,因为你只是有一个类只有静态变量和方法没有一点:
public class Elvis {
private static double weight; // in pounds
static { weight = 300.; } // Could just have set the weight directly above,
// but a static block might be useful for more complex examples.
public static double getWeight() { return weight; }
public static void setWeight(double weight) { this.weight = weight; }
}
我想这应该避免的,因为它看起来更像一个标题C文件比OO文件。
有些人可能已经认识到J. Bloch的“Effective Java”中的Elvis参考文献。在这本书中的建议是使用一个成员来实现与枚举单件模式:
public enum Elvis {
INSTANCE;
private double weight = 300.;
public double getWeight() { return weight; }
public void setWeight(double weight) { this.weight = weigth; }
}
注意,它看起来有点非标准这里与不同体重,因为你通常期望枚举实例是不可变的。
嗨,万一我没有提到持有单身本身的实例,但其他普通数据成员的变量是否有私人实例和私人静态之间的任何区别? – 2012-01-12 00:59:39