1 java gwt singleton gwt-activities gwt-places
这之间有什么区别(性能和其他):
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;
}
}
Run Code Online (Sandbox Code Playgroud)
和:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,我是Place不是一遍又一遍地重复使用相同的"单例" ,或者每次请求时只是实例化一个新单元,这有什么区别.
同样,对于Activity来自内部的s的同样问题ActivityMapper.再次感谢!
经验法则:地方应该是不可改变的.考虑到这一点,只有当地点没有附加数据时才能使用单身地点(如HomePlace示例所示).因为地方是如此轻量级,使用单例与创建新实例的含义可以忽略不计.
对于活动来说,这是一个完全不同的故事,因为它们不是价值对象.
使用单身人士活动意味着什么?
onStop和onCancel,否则从以前使用的活动状态可能会泄漏到以后使用它.虽然它在某些情况下很有用,但我认为最好将缓存行为分开(关注点分离).ActivityMapper),因此您必须以某种方式向活动发出信号,表明该地点已更改(如果需要的话) .这可以ActivityMapper通过让活动收听来完成PlaceChangeEvent.如果您使用的MVP(拆分视图从活动),活动一般是轻量级的,因此使用短命的人释放你从上面请务必清除一切onStop与onCancel和告诉地方改变了活动和整体,使事情变得更简单:活动已创建,然后启动,然后取消或停止,它已经消失,准备进行垃圾回收.如果需要保留某些数据或计算结果的缓存,请使用所有活动实例将共享的显式缓存对象; 它让事情变得更加清晰.
关于MVP和视图生命周期的侧面说明:视图(小部件)通常是重量级的,因此对于经常使用的视图(小部件),您可能希望将它们作为单例.在这种情况下,您的活动必须清除其start方法(或可能onStop和onCancel)中的视图状态(字段值等),从而以某种方式消除短期活动的使用.视图的缓存(您可能考虑不使用单例,而是将实例保留在内存中一段时间并在一段时间后将其驱逐)应该被视为一种优化,其中构建新视图的成本远高于清除活动的成本开始.这是一个权衡.
我接近MVP的方式是视图本身没有状态,即演示者真正控制视图应该显示/知道/等等.因此清除视图start是流程的一部分:演示者(在许多情况下,活动)知道它处于什么状态,并且它在视图中反映了该状态; 并且start是它控制视图的时间.在Google I/O 2010期间,Google在GWT测试最佳实践会话中描述了这种方法.