Java 在Play Framework 2中使用静态助手类是一个好主意吗?

Java 在Play Framework 2中使用静态助手类是一个好主意吗?,java,playframework,thread-safety,Java,Playframework,Thread Safety,我正在用Java开发一个Play Framework 2应用程序,我想知道是否可以使用静态助手类 例如,我想知道一个用户是否已登录并已完成其配置文件。此测试需要几行代码,可能会发生更改,并且在应用程序中经常使用 因此,我在一个方法中编写了一个类,其中包含这些测试,其中包含一个参数(Session对象),我在任何地方都使用它 但是我每次都要实例化一个类来使用这个方法,所以在规模上它可能是低效的。使其静止安全吗?如果是,我还可以安全地使用哪个播放对象作为参数?当您说“测试”时,我假设您指的是一些检查

我正在用Java开发一个Play Framework 2应用程序,我想知道是否可以使用静态助手类

例如,我想知道一个用户是否已登录并已完成其配置文件。此测试需要几行代码,可能会发生更改,并且在应用程序中经常使用

因此,我在一个方法中编写了一个类,其中包含这些测试,其中包含一个参数(Session对象),我在任何地方都使用它

但是我每次都要实例化一个类来使用这个方法,所以在规模上它可能是低效的。使其静止安全吗?如果是,我还可以安全地使用哪个播放对象作为参数?

当您说“测试”时,我假设您指的是一些检查逻辑,而不是单元测试

在这种情况下,您可以使用依赖项注入而不是静态助手

上面的链接显示了如何在处理请求时使用注入控制器的示例

因此,以前您的控制器是:

public class Application extends Controller {

    public static Result index() {
        if (YourStaticHelper.yourStaticMethod.isOk()) {
            return ok("It works!");
        }
        else {
            return forbidden("NO");
        }
    }

}
现在它将变成:

public class Application extends Controller {

    @Inject
    YourStaticHelperInterface checker;

    public Result index() {  // no longer static
        if (checker.isOk()) {
            return ok("It works!");
        }
        else {
            return forbidden("NO");
        }
    }

}
不同之处在于前一种方法,如果您需要一个新的助手,您必须更改控制器代码以使其适应更改,而在第二种方法中,您只需要在运行时注入一个不同的实现,因为isOk()在接口中成为一个约定


好处是什么?谁知道呢。如果我完全自己在家里写东西,或者控制器代码实际上与助手紧密耦合,我会选择第一个。如果我在一家公司和其他人一起工作,我会选择第二个。这都是关于软件工程的废话,但事情就是这样运作的。

为什么要实例化一个类来使用该方法?这一功能听起来很适合作为静态方法。安全吗。。。谁知道呢。。。我们不知道该方法的作用!还有什么东西可以安全使用。。。我真的不知道,我不完全确定您关心的是什么…我的问题是:我必须检查什么才能确保静态方法(不在控制器中)在play框架中是线程安全的?在这方面,在这种情况下,哪些播放对象(如请求、会话…)是安全的?这是一个一般性的问题,关于应该做什么和不应该做什么,以及什么是做事情的最佳方式。有趣的答案,即使它不是我所期望的。