java GWT活动/场所应该是单例还是原型?
这两者的区别(性能和其他方面)是什么:
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;
}
}
换言之,无论我是一次又一次地重复使用相同的“singleton”Place
,还是每次请求时都实例化一个新的,有什么区别
同样,从ActivityMapper
内部为Activity
提出相同的问题。再次感谢
# 1 楼答案
经验法则:位置应该是不变的。考虑到这一点,只有当一个位置没有数据附加到它时,才能使用一个单例位置(如
HomePlace
示例)。因为位置是如此轻量级,所以使用单例与创建新实例的影响可以忽略不计对于活动来说,情况完全不同,因为它们不是价值对象
使用单例活动意味着什么
onStop
和onCancel
中的状态,否则以前使用该活动时的状态可能会泄漏到以后使用它时。虽然它在某些情况下很有用,但我认为最好保持缓存行为分离(关注点分离)李>ActivityMapper
的一个功能),因此您必须以某种方式向活动发出位置已更改的信号(当然,如果需要)。这可以在ActivityMapper
中完成,或者让活动收听PlaceChangeEvent
如果你使用MVP(将视图从活动中分离出来),活动通常是轻量级的,因此使用短期的活动可以让你从上述中解脱出来,确保你清除了
onStop
和onCancel
中的所有内容,告诉活动地点发生了变化,总体上使事情变得更简单:活动被创建,然后开始,然后取消或停止,它就消失了,准备被垃圾收集。如果需要保留某些数据或计算结果的缓存,则使用所有活动实例将共享的显式缓存对象;这让事情变得更清楚关于MVP和视图生命周期的一个附带说明:视图(小部件)通常是重量级的,所以对于经常使用的视图,您可能希望将其设置为单例。在这种情况下,您的活动必须在其
start
方法(或者可能是onStop
和onCancel
)中清除视图的状态(字段值等),以某种方式阻止短期活动的使用。视图中的缓存> EME>(您可能不考虑使用单点,而是将实例保持在内存中并在某个延迟之后删除它)应该被视为一种优化,在这里构建新视图比在活动开始时清除成本要高很多。这是一种权衡我处理MVP的方式是,视图本身没有状态,也就是说,演示者真正控制视图应该显示什么/知道什么/等等。因此,清除
start
上的视图是流程的一部分:演示者(在许多情况下是活动)知道它处于什么状态,并在视图中反映该状态;start
是它被赋予视图控制权的时间。谷歌在2010年谷歌I/O大会的GWT testing best practices会议上,在《Wave的形成》中描述了这种方法# 2 楼答案
托马斯的回答很好。只是想补充一些信息
您可以决定覆盖google提供的对象的默认实现。例如,您可以决定编写自己的活动映射器,该映射器将始终返回给定地点类型的相同活动实例。正如托马斯所说,这个地方并不是一个真正重要的东西。重要的是通过活动映射器与该地点链接的活动。尽管如此,您可能会遇到生命周期问题,编写启动和停止方法将非常困难
如果您想刷新现有的活动,您可能需要重新编码活动管理器,并向模式中添加更新方法
问问自己,当在浏览器中向前或向后按时,应用程序应该如何运行You can find some more details in an article I wrote about Activities and Places here.
希望能有所帮助