GWT活动/场所应该是单身人士还是原型?

时间:2012-11-23 11:34:26

标签: java gwt singleton gwt-places gwt-activities

这之间有什么区别(表现和其他方面):

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;
    }
}

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,或者每次请求时只是实例化一个新单词,这有什么区别。

此外,ActivityActivityMapper的问题也是如此。再次感谢!

2 个答案:

答案 0 :(得分:6)

经验法则:地方应该是不可改变的。考虑到这一点,只有当地点没有附加数据时才能使用单身地点(如HomePlace示例中所示)。因为地方是如此轻量级,使用单例与创建新实例的含义可以忽略不计。

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

使用单身人士活动意味着什么?

  • 您必须在onStoponCancel中清除状态,否则之前使用该活动的状态可能会泄漏到以后使用它。虽然它在某些情况下很有用,但我认为最好将缓存行为分开(关注点分离)。
  • 单例按照定义在应用程序的生命周期内保存在内存中,甚至是用户只能看到/使用一次的内存。例如,每个应用程序运行时,Google网上论坛的欢迎屏幕可能只会出现一次,那么为什么要将其保留在内存中呢?
  • 如果您在两个映射到同一活动的地方之间导航,则活动将不会重新启动(这是ActivityMapper的一项功能),因此您必须以某种方式向活动发出信号通知该地点已经改变了(如果需要的话)。这可以在ActivityMapper中完成,也可以让活动收听PlaceChangeEvent s。

如果您使用MVP(将视图从活动中分离出来),活动通常是轻量级的,因此使用短期活动可以使您从上面的中解放出来,确保清除onStop和{{中的所有内容1}} 告诉活动地点已经改变并且总体上使事情更简单:活动被创建,然后开始,然后取消或停止并且它已经消失,准备好被垃圾收集。如果需要保留某些数据或计算结果的缓存,请使用所有活动实例将共享的显式缓存对象;它让事情变得更加清晰。


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

我接触MVP的方式是视图本身没有 state ,即演示者真正控制视图应该显示/知道/等的内容。因此,清除onCancel上的视图是流程的一部分:演示者(在许多情况下,活动)知道它处于什么状态,并且它反映了视图中的状态;而start是控制视图的时间。在GWT testing best practices会话的Google I / O 2010期间,谷歌在制作Wave时描述了这种方法。

答案 1 :(得分:1)

托马斯给出了很好的答案。只是添加更多信息。

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

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

问问自己在浏览器中向前或向后按下时应用程序的行为方式。 You can find some more details in an article I wrote about Activities and Places here.

希望它会有所帮助。