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
sPlaceChangeEvent
onStop
和onCancel
中的所有内容,并告诉活动位置已更改,总体上使事情变得更简单:活动已创建,然后启动,然后取消或停止,它就消失了,准备进行垃圾收集。如果需要保留某些数据或计算结果的缓存,则使用所有活动实例将共享的显式缓存对象;这让事情更清楚了
关于MVP和视图生命周期的一个旁注:视图(小部件)通常是重量级的,所以对于经常使用的视图,您可能希望将它们设置为单例。在这种情况下,您的活动必须在其
start
方法(或者可能是onStop
和onCancel
)中清除视图的状态(字段值等),以某种方式阻止短期活动的使用。视图的缓存(您可能不考虑使用单点,而是将实例保存在内存中并在某个延迟之后删除它)应该被视为一种优化,这里构造一个新视图比在活动开始时清除它花费更多。这是一种权衡
我处理MVP的方式是,视图本身没有状态,也就是说,演示者真正控制视图应该显示/知道/等等。因此,在
start
上清除视图是流程的一部分:演示者(在许多情况下是活动)知道它处于什么状态,并在视图中反映该状态;start
是它被赋予视图控制权的时间。谷歌在2010年谷歌I/O会议期间的《Wave的形成》中描述了这种方法。经验法则:位置应该是不变的。记住这一点,只有当一个地方没有附加数据时,才能使用一个单独的地方(如您的HomePlace
示例)。因为位置是如此轻量级,所以使用单例与创建新实例的区别可以忽略不计
对于活动来说,情况完全不同,因为它们不是价值对象
使用单例活动意味着什么
- 您必须在
和onStop
中清除状态,否则以前使用该活动的状态可能会泄漏到以后使用该活动的状态中。虽然它在某些情况下很有用,但我认为最好保持缓存行为的分离(关注点的分离)onCancel
- 根据定义,单例在应用程序的整个生命周期中都保存在内存中,即使是那些用户只会看到/使用一次的单例。例如,每次应用程序运行时,Google Groups的欢迎屏幕可能只会出现一次,那么为什么要将其保留在内存中呢
- 如果您在两个都映射到同一活动的位置之间导航,活动将不会重新启动(这是
的一项功能),因此您必须以某种方式向活动发出位置已更改的信号(当然,如果需要)。这可以在ActivityMapper
中完成,也可以让活动侦听ActivityMapper
sPlaceChangeEvent
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;
}
}