Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GWT活动/场所应该是单件还是原型?_Java_Gwt_Singleton_Gwt Places_Gwt Activities - Fatal编程技术网

Java GWT活动/场所应该是单件还是原型?

Java GWT活动/场所应该是单件还是原型?,java,gwt,singleton,gwt-places,gwt-activities,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; }

这两者的区别(性能和其他方面)是什么:

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;
    }
}
以及:

换言之,无论我是一次又一次地重复使用同一个“singleton”
Place
,还是每次请求时都实例化一个新的,都有什么区别


另外,在
ActivityMapper
中为
Activity
设置相同的问题。再次感谢

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

对于活动来说,情况完全不同,因为它们不是价值对象

使用单例活动意味着什么

  • 您必须在
    onStop
    onCancel
    中清除状态,否则以前使用该活动的状态可能会泄漏到以后使用该活动的状态中。虽然它在某些情况下很有用,但我认为最好保持缓存行为的分离(关注点的分离)
  • 根据定义,单例在应用程序的整个生命周期中都保存在内存中,即使是那些用户只会看到/使用一次的单例。例如,每次应用程序运行时,Google Groups的欢迎屏幕可能只会出现一次,那么为什么要将其保留在内存中呢
  • 如果您在两个都映射到同一活动的位置之间导航,活动将不会重新启动(这是
    ActivityMapper
    的一项功能),因此您必须以某种方式向活动发出位置已更改的信号(当然,如果需要)。这可以在
    ActivityMapper
    中完成,也可以让活动侦听
    PlaceChangeEvent
    s
如果您使用MVP(将视图从活动中分离出来),活动通常是轻量级的,因此使用短期的活动可以使您摆脱上述情况。请确保清除
onStop
onCancel
中的所有内容,并告诉活动位置已更改,总体上使事情变得更简单:活动已创建,然后启动,然后取消或停止,它就消失了,准备进行垃圾收集。如果需要保留某些数据或计算结果的缓存,则使用所有活动实例将共享的显式缓存对象;这让事情更清楚了


关于MVP和视图生命周期的一个旁注:视图(小部件)通常是重量级的,所以对于经常使用的视图,您可能希望将它们设置为单例。在这种情况下,您的活动必须在其
start
方法(或者可能是
onStop
onCancel
)中清除视图的状态(字段值等),以某种方式阻止短期活动的使用。视图的缓存(您可能不考虑使用单点,而是将实例保存在内存中并在某个延迟之后删除它)应该被视为一种优化,这里构造一个新视图比在活动开始时清除它花费更多。这是一种权衡


我处理MVP的方式是,视图本身没有状态,也就是说,演示者真正控制视图应该显示/知道/等等。因此,在
start
上清除视图是流程的一部分:演示者(在许多情况下是活动)知道它处于什么状态,并在视图中反映该状态;
start
是它被赋予视图控制权的时间。谷歌在2010年谷歌I/O会议期间的《Wave的形成》中描述了这种方法。

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

对于活动来说,情况完全不同,因为它们不是价值对象

使用单例活动意味着什么

  • 您必须在
    onStop
    onCancel
    中清除状态,否则以前使用该活动的状态可能会泄漏到以后使用该活动的状态中。虽然它在某些情况下很有用,但我认为最好保持缓存行为的分离(关注点的分离)
  • 根据定义,单例在应用程序的整个生命周期中都保存在内存中,即使是那些用户只会看到/使用一次的单例。例如,每次应用程序运行时,Google Groups的欢迎屏幕可能只会出现一次,那么为什么要将其保留在内存中呢
  • 如果您在两个都映射到同一活动的位置之间导航,活动将不会重新启动(这是
    ActivityMapper
    的一项功能),因此您必须以某种方式向活动发出位置已更改的信号(当然,如果需要)。这可以在
    ActivityMapper
    中完成,也可以让活动侦听
    PlaceChangeEvent
    s
如果您使用MVP(将视图从活动中分离出来),活动通常是轻量级的,因此使用短期的活动可以使您摆脱上述情况。请确保清除
onStop
onCancel
中的所有内容,并告诉活动位置已更改,总体上使事情变得更简单:活动已创建,然后启动,然后取消或停止,它就消失了,准备进行垃圾收集。如果需要保留某些数据或计算结果的缓存,则使用所有活动实例将共享的显式缓存对象;这让事情更清楚了


关于MVP和视图生命周期的一个旁注:视图(小部件)通常是重量级的,所以对于经常使用的视图,您可能希望将它们设置为单例。在这种情况下,您的活动必须在其
start
方法(或者可能是
onStop
onCancel
)中清除视图的状态(字段值等),以某种方式击败u
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;
    }
}