Должны ли мероприятия / места 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;
}
}
Другими словами, какая разница, продолжаю ли я использовать один и тот же "синглтон"? Place
снова и снова, или если я просто создаю новый экземпляр каждый раз, когда он запрашивается.
Кроме того, тот же вопрос для Activity
с внутри ActivityMapper
, Еще раз спасибо!
2 ответа
Основное правило: места должны быть неизменными. Имея это в виду, использовать одноэлементное место можно только в том случае, если к этому месту не привязаны данные (как в вашем HomePlace
пример). Поскольку места настолько легковесны, последствия использования синглтона и создания нового экземпляра незначительны.
Это совершенно другая история для деятельности, потому что они не являются ценными объектами.
Что бы это означало, чтобы использовать синглтон активность?
- Вы должны очистить состояние в
onStop
а такжеonCancel
в противном случае состояние от предыдущего использования действия может просочиться в более позднее использование этого действия. Хотя в некоторых случаях это полезно, я думаю, что лучше кэшировать поведение отдельно (разделение задач). - синглтоны по определению хранятся в памяти на протяжении всего жизненного цикла приложения, даже те, которые пользователь увидит / использует только один раз. Например, экран приветствия групп Google, скорее всего, будет отображаться только один раз за запуск приложения, так зачем хранить его в памяти?
- если вы перемещаетесь между двумя местами, которые оба отображаются на одно и то же действие, оно не будет перезапущено (это особенность
ActivityMapper
), поэтому вы должны как-то сигнализировать активности, что место изменилось (при необходимости, конечно). Это можно сделать вActivityMapper
или при наличии активности слушатьPlaceChangeEvent
s.
Если вы используете MVP (разделение представления на активность), действия, как правило, облегченные, поэтому использование краткосрочных освобождает вас от вышеперечисленного и гарантирует, что вы очистите все в onStop
а такжеonCancel
исказать деятельности, что место изменилось, и в целом все упрощается: действие создается, затем запускается, затем отменяется или останавливается, и оно уходит, готовое для сбора мусора. Если вам нужно хранить кэш некоторых данных или результатов вычислений, используйте явный объект кеша, которым будут делиться все ваши экземпляры активности; это проясняет ситуацию.
Дополнительное примечание о жизненном цикле MVP и представлений: представления (виджеты), как правило, имеют большой вес, поэтому для часто используемых из них вы можете сделать их одиночными. В этом случае ваша деятельность должна будет очистить состояние представления (значения полей и т. Д.) В его start
метод (или, возможно, onStop
а такжеonCancel
), как-то победив использование недолгой деятельности.Кэширование представления (вы могли бы рассмотреть не использование синглтона, а скорее сохранение экземпляра в памяти в течение некоторого времени и удаление его после некоторой задержки) следует рассматривать как оптимизацию, где создание нового представления стоит дороже, чем очистка его по активности Начните. Это компромисс.
То, как я подхожу к MVP, заключается в том, что представление не имеет отдельного состояния, то есть докладчик действительно контролирует, что представление должно отображать / знать / и т.д. так проясняя взгляд на start
является частью потока: докладчик (во многих случаях действие) знает, в каком состоянии он находится, и он отражает это состояние в представлении; а также start
это время, когда оно получает контроль над представлением. Этот подход был описан Google во время создания Wave во время Google I/O 2010 во время сеанса лучших практик тестирования GWT.
Отличный ответ Томаса. Просто чтобы добавить больше информации.
Вы можете переопределить реализацию по умолчанию объектов, предоставленных Google. Например, вы можете написать свой собственный маппер активности, который всегда будет возвращать один и тот же экземпляр активности для данного типа места. По словам Томаса, место не очень важный объект. Это действие, связанное с этим Местом через маппер деятельности, имеет значение. Тем не менее, у вас могут быть проблемы с жизненным циклом, и кодирование методов запуска и остановки будет очень трудным.
Возможно, вы захотите перекодировать менеджер операций и добавить в шаблон метод обновления, чтобы обновить существующее действие, если это то, что вы хотите сделать
Спросите себя, как ваше приложение должно вести себя при нажатии вперед или назад в вашем браузере. Вы можете найти более подробную информацию в статье, которую я написал о деятельности и местах здесь.
Надеюсь, это поможет.