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