这两者(性能和其他方面)有什么不同:
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
,还是每次请求时都实例化一个新的and,有什么区别呢?
另外,从ActivityMapper
内部对Activity
也提出了同样的问题。再次感谢!
发布于 2012-11-23 13:54:48
经验法则:位置应该是不变的。考虑到这一点,只有当一个单独的位置没有附加数据时,才能使用该位置(如您的HomePlace
示例所示)。因为places是如此轻量级,所以使用单例与创建新实例之间的关系可以忽略不计。
对于活动来说,这是一个完全不同的故事,因为它们不是值对象。
使用单例活动意味着什么?
onStop
和onCancel
中的状态,否则前一次使用活动的状态可能会泄露到以后的使用中。虽然它在某些情况下很有用,但我认为最好保持缓存行为的分离(根据定义,concerns).ActivityMapper
的一个功能),因此您必须以某种方式向该活动发出信号,表明该位置已更改(当然,如果需要)。这可以在ActivityMapper
中完成,也可以通过让活动监听PlaceChangeEvent
s.来完成
如果你使用MVP (将视图从活动中分离出来),活动通常是轻量级的,所以使用短暂的活动可以让你从上面的事情中解脱出来,确保你清除了onStop
和onCancel
中的所有东西,并告诉活动位置已经改变,总体上让事情变得更简单:活动被创建,然后启动,然后被取消或停止,它消失了,准备被垃圾回收。如果您需要对某些数据或计算结果进行缓存,那么请使用所有活动实例都将共享的显式缓存对象;这会使事情变得更加清晰。
关于MVP和视图生命周期的一个附注:视图(窗口小部件)通常是重量级的,所以对于经常使用的窗口小部件,您可能希望将其设置为单例。在这种情况下,您的活动必须清除视图的状态(字段值等)在它的start
方法(或者可能是onStop
和onCancel
)中,以某种方式击败了短暂活动的使用。在这里,视图的缓存(您可以考虑不使用单例,而是在内存中保留实例一段时间,并在延迟后将其逐出)应该被视为优化,其中构造新视图的成本比在活动开始时清除它的成本要高得多。这是一种权衡。
我处理MVP的方法是视图本身没有状态,也就是说,展示者实际上控制着视图应该显示/知道什么等等,所以在start
上清除视图是流程的一部分:展示者(在许多情况下是活动)知道它处于什么状态,并且它在视图中反映该状态;start
是赋予它对视图的控制权的时间。在GWT testing best practices会议的谷歌I/O2010期间,谷歌在制作Wave中描述了这种方法。
发布于 2013-03-08 20:35:24
托马斯回答得很好。只是为了添加更多信息。
您可以决定覆盖google提供的对象的默认实现。例如,您可以决定编写自己的活动映射器,该映射器将始终返回给定类型的场所的相同活动实例。正如托马斯所说,这个地方并不是一个真正重要的物体。重要的是通过活动映射器与该位置链接的活动。尽管如此,您可能会遇到生命周期问题,并且编写启动和停止方法的代码将非常困难。
您可能希望对活动管理器进行重新编码,并将更新方法添加到模式中,以刷新现有活动(如果这是您想要执行的操作
问问自己,当在浏览器中向前或向后按键时,应用程序应该如何工作。You can find some more details in an article I wrote about Activities and Places here.
希望这能有所帮助。
https://stackoverflow.com/questions/13528268
复制相似问题