gpt4 book ai didi

java - GWT Activity/Places 应该是 Singletons 还是 Prototypes?

转载 作者:行者123 更新时间:2023-11-29 06:40:01 24 4
gpt4 key购买 nike

这之间有什么区别(性能和其他方面):

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,还是在每次请求时都实例化一个新的,有什么区别。

此外,ActivityMapper 中的 Activity 也有同样的问题。再次感谢!

最佳答案

经验法则:地方应该是不可变的。考虑到这一点,只有在该地点没有附加数据(如您的HomePlace 示例中)时,才能使用单例地点。因为地方是如此轻量级,所以使用单例与创建新实例的影响可以忽略不计。

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

使用单例 Activity 意味着什么?

  • 您必须清除 onStoponCancel 中的状态,否则先前使用该 Activity 的状态可能会泄漏到以后的使用中。虽然它在某些情况下很有用,但我认为最好将缓存行为分开(关注点分离)。
  • 根据定义,单例在应用程序的生命周期内保存在内存中,即使是那些用户只会看到/使用一次的单例。例如,Google 网上论坛的欢迎屏幕很可能在每次应用程序运行时只出现一次,那么为什么要将它保存在内存中?
  • 如果您在两个映射到同一个 Activity 的地方之间导航, Activity 将不会重新启动(这是 ActivityMapper 的一个功能),因此您必须以某种方式向 Activity 发出信号这个地方已经改变了(当然如果需要的话)。这可以在 ActivityMapper 中完成,也可以通过让 Activity 监听 PlaceChangeEvent 来完成。

如果您使用 MVP(将 View 从 Activity 中分离出来),Activity 通常是轻量级的,因此使用短生命周期的 Activity 可以让您摆脱上述问题确保清除 onStop 中的所有内容以及 onCancel告诉 Activity 这个地方已经改变了 总体上让事情变得更简单:Activity 创建,然后启动,然后取消或停止,然后它就消失了,准备好被垃圾收集。如果您需要保留某些数据或计算结果的缓存,则使用所有 Activity 实例将共享的显式缓存对象;它让事情变得更清晰。


关于 MVP 和 View 生命周期的旁注: View (小部件)通常是重量级的,因此对于经常使用的 View ,您可能希望将它们设为单例。在这种情况下,您的 Activity 必须在其 start 方法(或者可能是 onStoponCancel), 以某种方式击败了短期 Activity 的使用。 View 的缓存(您可能会考虑不使用单例,而是将实例在内存中保留一段时间并在一段时间后将其逐出)应该被视为此处的优化,其中构建新 View 比在 Activity 开始时清除它花费更多。这是一种权衡。

我处理 MVP 的方式是 View 本身没有状态,即演示者真正控制 View 应该显示/知道/等的内容。所以在 start 上清除 View 是流程的一部分:presenter(在很多情况下是 Activity )知道它处于什么状态,并且它在 View 中反射(reflect)了该状态; start 是它获得 View 控制权的时间。在 Google I/O 2010 的 GWT testing best practices 中,Google 在 Wave 的制作过程中描述了这种方法。 session 。

关于java - GWT Activity/Places 应该是 Singletons 还是 Prototypes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13528268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com