gpt4 book ai didi

java - 游戏中!框架 我可以在模型包 Singleton 中创建类吗?

转载 作者:行者123 更新时间:2023-11-30 06:53:19 25 4
gpt4 key购买 nike

我是新手!现在开始玩吧!大致适用于路线、 Controller 和模型。模型中的类用@Entity注释,它成为数据库中的一个表,因此我们可以将模型包中的类的方法保持为静态,而不是将其变成单例,以便我可以进一步使用接口(interface)实现它并使用它有效
如果模型包中的类被设置为单例,那么它是每个 session 的单例还是整个应用程序的单例
我将提供一些粗略的例子,我无法发布真实的代码,因为我工作的公司不允许我这样做,我真的很抱歉

旧版本代码如下

Code for MyModelN class in Models package as there are many such Model classes containing the same kind of methods

   @Entity   
@Table(name == "MyModelN")
class MyModelN{
public static String column1;
public static String column2;
.............
public static String coulmnN;

public static MyModelN findAll(){
return /*Some JPA code*/
}
public static MyModelN findId(){
return /*Some JPA code*/
}
/*And so On*/
}

Code For MyControllerN class in Controllers package there are many such controllers

  class MyControllerN extends Controller{
public static Result create(){
/*Some code which uses the models ...*/
MyModelN.finAll();
return ok();
}
/*And so On*/
}

Code for the routes file

GET           /finance/create               controller.MyControllerN.create()

The above code works fine and serves the purpose , But it contains about 70% code redundant in every controller .So to make it modular and reusable I made an Interface IFinance that extends MyModelN and I made a commonController class which contains the common code of every controller and i wish to use the IFinance handle in the commonController class .......The new version is as follows
Code for MyModelN class in Models package as mentioned before (This time no static)

   @Entity   
@Table(name == "MyModelN")
class MyModelN implementes IFinance{
public String column1;
public String column2;
.............
public String coulmnN;

public MyModelN findAll(){
return /*Some JPA code*/
}
public MyModelN findId(){
return /*Some JPA code*/
}
/*And so On*/
}

Code For MyControllerN class in Controllers package as mentioned above (Now no static)

  class MyControllerN extends Controller{
private IFinance iFinance;
private MyModelN myModelN = new MyModelN();
private CommonController commonController = new CommonController(myModelN);
public Result create(){
/*Some code which uses the models ...*/
return commonController.createCommon();
}
/*And so On*/
}

Code for CommonController

class MyControllerN extends Controller{
private IFinance iFinance;
MyControllerN(IFinance iFinance){
this.iFinance = iFinance;
}
public Result createCommon(){
/*Some code which uses the models ...*/
iFinance.findAll();
return ok()
}
/*And so On*/
}

Code for the routes file is dynamic instead of static

GET           /finance/create               @controller.MyControllerN.create()

This works fine for me , here the issue is in every controller I end up making a new object of MyModelN classes whenever I have to use it in Controller,

  1. 所以我想知道我是否可以使我的 MyModelN 类成为单例,这样我在每个地方都会得到相同的对象,并且最终不会为模型创建很多对象,因为它与静态一起工作得很好,我认为单例会起作用,但我不确定
  2. 现在,如果某个 MyModelN 类依赖于其他 @ManytoOne MyModel1 myModel1@OnetoMany MyModel1 myModel 并且我最终会再次为该模型创建新对象,所以如果我使它成为单例,我将得到相同的对象,但它会导致一些干扰和数据混合的问题吗?
  3. 我想知道 Play 在内部如何处理这个问题,当我创建 MyModels 类 Singleton 时,它是每个 session 的单例还是整个应用程序的单例,如果是整个应用程序的单例,那么为什么有这么多用户同时使用该网站他们的数据不会与其他数据混淆

谢谢

最佳答案

经过对 Play 的一些研究!框架我想回答这个问题

  1. 当我们创建一个用@Entity注解的类单例时,该类是每个 session 单例还是整个应用程序单例?

    • 是的,整个应用程序的类都是单例的,即整个应用程序中只会创建单例类的一个实例
  2. 是否建议保留您的模型类,即使用 @Entity Singleton/Static 注解的类?

    • 不,不建议保留 Singleton 类,因为当多个用户同时使用同一个 @Entity 类时,这可能会导致数据不一致

我们必须明白,Play! FrameworkPlay 是一个无状态、异步、非阻塞的框架,它使用底层的 fork-join 线程池来窃取网络操作的工作,并可以利用 Akka 进行用户级操作。有关更多信息,请查看此链接 click here

因此,当我们使用动态路由时,每次客户端点击 Controller 时都会创建 Controller 类(扩展播放 Controller 的类)的新实例,有关更多信息click here

但是,如果我们创建任何其他单例类,我们将在整个应用程序中为播放 Controller 的所有/任何实例获得单例类的相同实例

谢谢

关于java - 游戏中!框架 我可以在模型包 Singleton 中创建类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42311587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com