目前我在游戏框架中很有趣,因为这个框架可以促进更快的发展。
当我看到代码时,有很多静态代码。甚至控制器声明为静态功能。因此,调用内部静态函数的所有代码必须是静态的吗?
我的问题是,这种做法是对的吗?使用许多静态函数有任何副作用吗?
答案 0 :(得分:17)
之前已经以类似的方式询问了这个问题。简单的答案是Play在合理的地方使用静态。
HTTP模型不是OO模型。 HTTP请求本身是无状态的,因此,静态方法允许从客户端代码访问控制器作为功能请求。
另一方面,Model类是纯OO,因此不是静态重。 某些实用程序方法(如findAll或findById)是静态的,但这些方法同样不是statefull,而且是类的实用程序方法。无论如何,我希望在标准的OO模型中这样做。
因此,我不认为以Play预期的方式做事有任何风险。它可能看起来很奇怪,因为它挑战了规范,但出于合理的原因它也是如此。
答案 1 :(得分:8)
关于面向对象语言中静态方法的一些事情:如果你选择使用所有静态方法,让我试着解释一下这些问题。
在面向对象语言中使用所有静态函数可能不是惯用的。 您不能覆盖子类中的静态函数。因此,您无法通过覆盖来执行运行时多态性。
您定义的变量都会自动成为类变量(因为您的所有方法都是静态的),所以基本上您没有与该实例关联的任何状态。
静态方法难以模拟。您可能需要像PowerMock这样的框架来为您进行模拟。因此测试变得困难。
设计变得有点复杂,因为您将无法创建不可变类,因为您实际上只有类而没有实例。因此,设计线程安全类变得困难。
答案 2 :(得分:1)
详细说明我的评论。
静态方法可以调用非静态方法,前提是你有一个实例。
class A {
public void nonStaticMethod() { }
public static void staticMethod(String text) {
// calls non-static method on text
text.length();
// calls non-static method on new Object
new Object().hashCode();
// calls non static method on a instance of A
new A().nonStaticMethod();
}
}
答案 3 :(得分:-3)
是的,使用太多静态函数或变量会产生副作用。 您应该避免不必要的静态声明。
因为一旦在JRE中加载了类,静态成员总是会创建一个内存空间。即使你没有创建类的对象,它也会占用内存。