首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GWT活动/地点应该是单例还是原型?

GWT活动/地点应该是单例还是原型?
EN

Stack Overflow用户
提问于 2012-11-23 19:34:26
回答 2查看 881关注 0票数 1

这两者(性能和其他方面)有什么不同:

代码语言:javascript
复制
public class MyPlaceMapper implements PlaceHistoryMapper {
    @Override
    public String getToken(Place place) {
        if(place instanceof HomePlace)
            return "home";
        else
            return null;
    }

    @Override
    public Place getPlace(String token) {
        if(token.equals("home"))
            return new HomePlace();
        else
            return null;
    }
}

和:

代码语言:javascript
复制
public class MyPlaceMapper implements PlaceHistoryMapper {
    // Singleton HomePlace to inject and reuse over and over again
    private HomePlace homePlace;

    // Getter/setter for homePlace...

    @Override
    public String getToken(Place place) {
        if(place instanceof HomePlace)
            return "home";
        else
            return null;
    }

    @Override
    public Place getPlace(String token) {
        if(token.equals("home"))
            return homePlace;
        else
            return null;
    }
}

换句话说,如果我一遍又一遍地重复使用相同的“单例”Place,还是每次请求时都实例化一个新的and,有什么区别呢?

另外,从ActivityMapper内部对Activity也提出了同样的问题。再次感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-23 21:54:48

经验法则:位置应该是不变的。考虑到这一点,只有当一个单独的位置没有附加数据时,才能使用该位置(如您的HomePlace示例所示)。因为places是如此轻量级,所以使用单例与创建新实例之间的关系可以忽略不计。

对于活动来说,这是一个完全不同的故事,因为它们不是值对象。

使用单例活动意味着什么?

  • 你必须清除onStoponCancel中的状态,否则前一次使用活动的状态可能会泄露到以后的使用中。虽然它在某些情况下很有用,但我认为最好保持缓存行为的分离(根据定义,concerns).
  • singletons的分离是在应用程序的生命周期内保存在内存中的,即使是用户只能看到/使用一次的缓存行为)。例如,Groups的欢迎屏幕很可能在每次应用程序运行时只出现一次,那么为什么要将其保留在内存中?
  • 如果您在两个都映射到同一活动的位置之间导航,该活动将不会重新启动(这是ActivityMapper的一个功能),因此您必须以某种方式向该活动发出信号,表明该位置已更改(当然,如果需要)。这可以在ActivityMapper中完成,也可以通过让活动监听PlaceChangeEvents.

来完成

如果你使用MVP (将视图从活动中分离出来),活动通常是轻量级的,所以使用短暂的活动可以让你从上面的事情中解脱出来,确保你清除了onStoponCancel中的所有东西,并告诉活动位置已经改变,总体上让事情变得更简单:活动被创建,然后启动,然后被取消或停止,它消失了,准备被垃圾回收。如果您需要对某些数据或计算结果进行缓存,那么请使用所有活动实例都将共享的显式缓存对象;这会使事情变得更加清晰。

关于MVP和视图生命周期的一个附注:视图(窗口小部件)通常是重量级的,所以对于经常使用的窗口小部件,您可能希望将其设置为单例。在这种情况下,您的活动必须清除视图的状态(字段值等)在它的start方法(或者可能是onStoponCancel)中,以某种方式击败了短暂活动的使用。在这里,视图的缓存(您可以考虑不使用单例,而是在内存中保留实例一段时间,并在延迟后将其逐出)应该被视为优化,其中构造新视图的成本比在活动开始时清除它的成本要高得多。这是一种权衡。

我处理MVP的方法是视图本身没有状态,也就是说,展示者实际上控制着视图应该显示/知道什么等等,所以在start上清除视图是流程的一部分:展示者(在许多情况下是活动)知道它处于什么状态,并且它在视图中反映该状态;start是赋予它对视图的控制权的时间。在GWT testing best practices会议的谷歌I/O2010期间,谷歌在制作Wave中描述了这种方法。

票数 6
EN

Stack Overflow用户

发布于 2013-03-09 04:35:24

托马斯回答得很好。只是为了添加更多信息。

您可以决定覆盖google提供的对象的默认实现。例如,您可以决定编写自己的活动映射器,该映射器将始终返回给定类型的场所的相同活动实例。正如托马斯所说,这个地方并不是一个真正重要的物体。重要的是通过活动映射器与该位置链接的活动。尽管如此,您可能会遇到生命周期问题,并且编写启动和停止方法的代码将非常困难。

您可能希望对活动管理器进行重新编码,并将更新方法添加到模式中,以刷新现有活动(如果这是您想要执行的操作

问问自己,当在浏览器中向前或向后按键时,应用程序应该如何工作。You can find some more details in an article I wrote about Activities and Places here.

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13528268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档