单身比静态好吗?

时间:2011-10-25 03:44:14

标签: java singleton global

所以我在游戏中有一个玩家类。逻辑上只需要一个玩家对象(单个玩家)但是很多不同的类需要访问玩家对象。 (即,地图需要知道玩家是否,以及相机和敌人需要与玩家互动等)。

我有几个选择。

我可以将这个玩家对象传递给需要它的所有东西,这很麻烦。 (依赖注入,我认为它被称为)

将其公之于众。

让它成为单身人士。

每个人的利弊是什么?

6 个答案:

答案 0 :(得分:3)

我不会在这里使用Singleton或静态变量,而是通过setter将Player实例交给需要它的类。如果您只需要一个播放器实例 - 只需拨打new Player()一次: - )

参见我对单身人士的看法here。简短摘要:它们的典型误用(避免“繁琐”的设置者)违反了OO并降低了设计质量。

静态变量与单身人物一样,与Monostate一起切割(非静态吸气剂,静态数据,构造函数是“工厂”)。避免他们。考虑一下你是否让一切都变得静止:玩家,地图,相机,敌人等等。你会避免很多“笨重”的制定者。但它是OO吗?当你完成你的游戏时,你可以在另一个游戏中重复使用你的寻路算法,AI算法等,或者它们是否有太多全局变量(Singletons等)特定于你当前的游戏永远被烧成它们?

答案 1 :(得分:1)

所以,你的选择是:

  

让它公开静态。   把它变成单身。

两者都会有效地将其变成全局变量。我不是全局的忠实粉丝:他们让一切都更难以测试和调试。

优点:更轻松访问

缺点:非常高的耦合(如果你想让它成为双人游戏怎么办?);增加测试的复杂性;在一个地方更换玩家可能会对其他地方产生意想不到的后果。

  

我可以将这个玩家对象传递给需要它的所有东西,这很麻烦。 (依赖注入,我认为它被称为)

优点:较低的耦合;便于测试;您可以将播放器的副本传递给其他类,并减少副作用的可能性。

缺点:必须传递Player引用会使API更复杂,但可以通过使用依赖注入框架(例如Guice)来缓解其中的一部分

答案 2 :(得分:0)

除了Java Setter and Getter提供的优点之外,我真的不会想到单身模式(public static Type getInstance())会通过公共变量(public static Type var)给你的任何新的。

但总的来说,总是更好(从未来的pov)控制对成员变量的访问(特别是从外部访问 将此作为成员变量的类),所以我建议{{1带有公共getter的变量。这是在单身人士和公共静态变量之间的某个地方。

答案 3 :(得分:0)

使用单例使您可以扩展基类并提供Player的替代实现,使用静态方法现在可以实现灵活性。

另一点是“概念上”玩家是一个对象,而不是一个类。

答案 4 :(得分:0)

我会避免让它变得静止。您希望您的代码可以重复使用,并且播放器肯定是一个对象,可能需要在备用项目中使用多个实例。

我会创建简单的getAttribute(),editAttribute方法来返回或编辑我需要的属性。

另一种选择是简单地在播放器类中公开可共享属性,尽管我更喜欢get / edit方法选项。

答案 5 :(得分:0)

单身人士可以实现可用于引用单身人士的界面。即,您不需要在整个代码中对单例进行硬编码引用。如果您想要一个不同的实例用于测试目的,这可以使单元测试更容易。

public interface Printer {
   public void print(String line);
}

public enum ConsolePrinter implements Printer {
   INSTANCE;
   public void print(String line) {
       System.out.println(line);
   }
}

// to print to the screen
Printer printer = ConsolePrinter.INSTANCE;

// for testing purposes.
Printer printer = createMock(Printer.class);