真正是静态的静态类没有错。也就是说,没有可以说会导致方法输出更改的内部状态。
如果Dice.roll()
只是从1到6返回一个新的随机数,则不会更改状态。当然,您可能正在共享一个Random
实例,但是根据定义,我不会认为状态会发生变化,输出始终会是随机的。它也是线程安全的,因此这里没有问题。
您经常会看到最终的“ Helper”或其他具有私有构造函数和静态成员的实用程序类。私有构造函数不包含任何逻辑,仅用于防止某人实例化该类。最后的修饰符只会使这个主意变为现实,因为这不是您想要派生的类。它仅仅是一个实用程序类。如果做得正确,则不应有单例或其他本身不是静态的和最终的类成员。
只要您遵循这些准则,并且您没有使单身,这绝对没有错。您提到了一个控制器类,并且几乎肯定会需要状态更改,因此我建议不要只使用静态方法。您可以高度依赖静态实用程序类,但不能使其成为静态实用程序类。
什么是班级状态变化?好吧,让我们排除一秒钟的随机数,因为根据定义它们是不确定的,因此返回值经常变化。
纯函数是确定性函数,也就是说,对于给定的输入,您将只获得一个输出。您希望静态方法是纯函数。在Java中,有一些方法可以调整静态方法的行为以保持状态,但它们绝不是好主意。当您将一个方法声明为static时,典型的程序员会马上认为它是一个纯函数。通常,应该避免与预期行为的偏离,这是您倾向于在程序中创建错误的方式。
单例是一个包含静态方法的类,它与“纯函数”差不多。该类内部仅保留一个静态私有成员,该成员用于确保仅存在一个实例。这不是最佳做法,并且由于多种原因可能在以后给您带来麻烦。要知道我们在说什么,下面是一个单例的简单示例:
// DON'T DO THIS!
class Singleton {
private String name;
private static Singleton instance = null;
private Singleton(String name) {
this.name = name;
}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton("George");
}
return instance;
}
public getName() {
return name;
}
}
assert Singleton.getInstance().getName() == "George"