我也对正在使用的静态方法的数量感到惊讶,但如果它工作正常,为什么不...
其实我不同意你老师的观点。
如果一个对象没有状态(即全局变量)但只包含示例方法,那么使用对象而不是静态方法不会给您带来任何好处。除非您打算稍后添加状态(不应该共享的状态),或者您正在使用接口并且希望能够轻松切换实现,否则使用静态方法更容易......
JDK 本身、apache commons 或许多框架都包含静态方法:
- 字符串实用程序
- Pattern.matches(正则表达式,输入)
----------
其实我猜你想知道像 JPA.java 这样的类是什么:
https ://github.com/playframework/play/blob/master/framework/src/play/db/jpa/JPA.java
他们只使用静态方法并保持静态。这可能很奇怪,但实际上对我来说这有点像使用单例,除了这些方法是在静态上下文而不是对象上使用的。主要区别在于您不必每次都调用 getInstance()。
我认为这是为了可用性而设计的,因为调用“getInstance”对用户不友好,并且能够轻松地在任何地方获得会话(链接到线程)而不是在任何地方使用 xml 或 autowiring 注入 sessionFactory 是很酷的。 ..
您的教授可能会告诉您避免使用静态,因为如果您不正确使用它们可能会对您的设计造成危险。但是请注意,在许多情况下,用单例替换静态方法并不能使您的设计更好。即使您现在在实例方法上调用方法,对象仍将紧密耦合...
所以也许一个规则应该是避免使用静态,除非你真的不关心紧耦合。
在这种情况下,当您调用 JPA.xxx() 方法时,您的代码与播放框架的 JPA 类紧密耦合。但我不认为 play 的设计目的是让您能够轻松地从一个框架切换到另一个框架,而无需至少进行一些返工......
这与 EJB3 规范或类似的东西有很大的不同:如果 EJB3 实体管理器的方法是静态的,您将被迫通过调用 HibernateEntityManager.xxx() 或 ToplinkEntityManager.xxx() 将代码与实现紧密耦合。在这种情况下,有一个通用接口(我们不能在接口上添加静态方法)。
----------
- 该类不是用于其他框架的规范的一部分。
- JPA 类只有一种实现:由 play 完成的实现。他们可能不打算制作第二个。
- 因此,当您使用 Play 框架时,与这个 Play 类的紧密耦合对我来说似乎没问题。