玩!框架使用<lot>的静态

Sae*_*aew 76 java static playframework playframework-1.x

哇,玩!框架有很多静态方法.在我上学的地方,我们被告知永远不会使用任何静力学,但玩!使用它就像没有明天一样.那是不是很好?如果是这样,为什么?

我们(7个人和我)正计划使用Play!涉及Web应用程序的项目框架.我们决定玩Play!因为它看起来很有趣,我们所有人都已经知道Java并且任务很难,所以我们想要专注于实际的任务,而不是学习如何用不同的语言编程.

我们总是说,但是,永远不要用"静在我们开发的任何Java程序,但是当我看着玩!......好吧......大约一半的方法都是静态的.</夸张>

我想,至少,我们可以使用单例对象(通过使用Scala,例如^^)来编程我们的项目,但我非常担心框架本身实际上有多少静态.

那么,我应该关注这个吗?玩的方式!开发人员编程使它成为所有这些静态不会造成问题的?

(例如,这个主题有一个关于为什么要不惜一切代价避免静态成员的咆哮.)

小智 95

Play只有在有意义时才使用静态方法:

  • 在控制器层中,因为控制器不是面向对象的.控制器充当HTTP世界(无状态,基于请求/响应)和完全面向对象的模型层之间的映射器.
  • 在工厂方法的模型层中,如findAll(),count(),create()当然不依赖于任何特定实例
  • 在一些提供纯实用函数的play.libs.*类中

  • 我习惯拥有通过DI框架注入依赖关系的控制器.如何使用静态对象实现DI? (9认同)
  • @Guillaume我必须大力反对你,Play展示了编写Java的最糟糕的做法,并且不应该在Java代码中使用`static`s.静力学不表示不变性,相反静态表示*共享状态*与你所声称的几乎完全相反.然后有一些反射有趣的东西,比如在错误的实例上调用静态方法,因为静态方法甚至没有与它们定义的类配对.简而言之,Java中的`static`是一个巨大的代码气味,不应该出现在所有如果你的目标是编写现代Java. (6认同)
  • 使用[静态`验证`成员](http://www.playframework.org/documentation/api/1.1/play/mvc/Controller.html#validation)(见[例子](http:// www. playframework.org/documentation/1.2.3/validation#objects))结合"ThreadLocal"显示,静态并不适用于所有情况. (3认同)
  • @Esko我绝对同意你的看法,Play可能在scala中很有价值,但在Java中它总结了一系列不良做法. (2认同)

dde*_*any 34

Play框架不是一个很好的演示,当使用静态是合适的,也不能证明你的老师是错的.Play是一种作弊行为,解决了Java语言之外的静态问题.

关键问题是你必须并行处理多个HTTP请求,静态字段是"全局的".因此,对于某些事情,每个线程需要一个实例(甚至更好,每个HTTP请求一个实例),但其中一些实例是由Play中的静态方法返回的.这很有效,因为玩!使用ThreadLocal-s很重,因此它解决了Java语言之外的静态问题.但那不是一切.有人说控制器方法是正确的静态.当然,但是在普通的Java中它会很不方便,因为你不能在没有某种前缀的情况下访问特定于请求的数据,比如req.in req.session,然后你仍然必须req从某个地方获取,比如作为静态控制器方法的参数,这更麻烦.然而在Play中你可以直接写作session和喜欢,它们只是静态字段.那是因为Play使用字节码检测将所有静态字段引用更改为更智能的东西.同样,Java语言之外的解决方案.那些不是最后的静态字段.

所以,一般来说,避免非最终静态.Play虽然为你带来了魔力,所以在这种情况下不要害怕它们.


unw*_*ind 15

从一个非常简单的介绍一下,我会说这样的有道理:web请求是无状态的,所以没有对象接收请求(=方法).因此,将诸如"/ articles/archive?date = 08/01/08&page = 2"之类的URI映射到一个名为archive()on 的静态方法,我想,你的应用程序类是有意义的.


Did*_*ero 8

编辑 现在在Play 2.4中,注射自动完成.所以只需在文件中的控制器路径的开头添加@ routes就可以了:

GET     /                  @controllers.Application.index()
Run Code Online (Sandbox Code Playgroud)

对于旧版本(2.1到2.3),您必须覆盖Global类中的getControllerInstance,如Documentantion中所述.


Joe*_*ckx 5

与编程中的任何内容一样,永远不会是正确的答案.就像往常一样.总有例外,正确的答案总是"它取决于".

确实,在纯粹的OO中(我都是这样),静力学的空间很小.但有时它们才有意义也是如此.

经典的例子是实用方法.当然,如果我们可以将我们的abs()方法附加到Integer 会更好.但我们不能; 所以我们坚持了下来Math.abs(int i).

我倾向于认为,当一个方法与实例本身无关时,将方法设置为静态是正确的.例如,在课堂上Person,您可以使用一个方法来获取人员列表,并返回今天有生日的人数.如果计算所需的数据是私有的(OO纯粹主义者会理解的东西;)),也许你只能在类本身中执行此操作,但该方法显然与单个Person实例无关.

另一件事是内部课程.如果不需要与包含类型的关系,通常希望将它们设置为静态.

我从未见过Play!但如果你说它超过50%是静态的,那么我猜它可能设计得很糟糕.那也不例外; 很多框架都是.不要让它让你失望.绝对不要向它学习!
但如果它有效,你仍然可以使用它.

  • Play的设计并不是很糟糕,但它与大多数Java库的设计方式背道而驰. (22认同)