Спасибо за все ответы. Закнесс подошел ближе всего, чтобы дать мне ответ, который мне был нужен, однако я придумал немного более простую модель.
Моей главной целью было избежать использования статической переменной в моей основной структуре данных. Я также столкнулся с проблемой попытки выяснить, была ли эта основная структура данных успешно извлечена из базы данных во время попытки доступа к ней, и что делать, если ее нет (то есть, когда она нулевая).
После просмотра Архитектуры Google Web Toolkit: лучшие практики для разработки вашего приложения GWT видео из Google IO идея шины событий казалась идеальной.
Я опубликую свое решение здесь на случай, если оно кому-нибудь поможет.
Сначала создайте класс Handler. Обратите внимание на ссылку на класс Event уже:
public interface CategoryChangeHandler extends EventHandler {
void onCategoryChange(CategoryChangeEvent event);
}
Теперь перейдем к классу Event. Это доставило мне больше всего хлопот:
public class CategoryChangeEvent extends GwtEvent<CategoryChangeHandler> {
private final List<Category> category;
public CategoryChangeEvent(List<Category> category) {
super();
this.category = category;
}
public static final Type<CategoryChangeHandler> TYPE = new Type<CategoryChangeHandler>();
@Override
protected void dispatch(CategoryChangeHandler handler) {
handler.onCategoryChange(this);
}
@Override
public com.google.gwt.event.shared.GwtEvent.Type<CategoryChangeHandler> getAssociatedType() {
return TYPE;
}
public List<Category> getCategories(){
return category;
}
}
Теперь я могу использовать эти классы Handler и Event, например, когда эта основная структура данных перезагружается:
Этот код получил структуру данных и хочет уведомить всех, кто слушает, что он обновился:
CategoryChangeEvent event = new CategoryChangeEvent(result);
eventBus.fireEvent(event);
Этот код является реализацией события
public class PopulateCategoryHandler implements CategoryChangeHandler {
@Override
public void onCategoryChange(CategoryChangeEvent event) {
tearDownCategories();
List<Category> categories = event.getCategories();
populateCategories(categories);
}
}