안녕하세요! 나는 상대적으로 GWT와 자바 프로그래밍 (또는 OOP 그 문제에 대한) 새로운, 그래서 초보자 질문/실수에 대한 사전 사과. 어떤 종류의 관찰자 패턴을 만들려고 노력했지만 개발 모드 콘솔은 오류 메시지를 계속 표시하고 슬프게도 도움이되지 않습니다.GWT의 옵저버 패턴
그래서 여기에 내가 얻으려는 것이있다 : - 나는 Country 클래스로 구성된 모델을 가지고 있으며 Influence라는 값을 저장한다. -보기는 CountryDisplay라는 클래스입니다. 주어진 국가의 현재 영향을 항상 표시해야하는 GWT 위젯입니다.
public class Country {
private int influece;
private CountryDisplay display;
public Country() {
influence = 0;
}
public void setDisplay(CountryDisplay display) //...
public int getInfluence() //...
public void setInfluence(int value) {
influence = value;
display.update();
}
}
public class CountryDisplay {
private Country country;
public CountryDisplay (Country country) {
//GWT widget creating stuff
this.country = country;
}
public void update() {
//InfluenceCounter is a simple Label
InfluenceCounter.setText(Integer.toString(country.getInfluence()));
}
}
은 그 다음의 EntryPoint 클래스에서 나는 같은 것을 할 :
Country italy = new Country();
CountryDisplay italyDisplay = new CountryDisplay(italy);
italy.setDisplay(italyDisplay);
RootPanel.get("nameFieldContainer").add(italyDisplay);
italy.setInfluence(3);
개발 콘솔은이 라인에 문제가 있다고 표시 "display.update를();" Country 클래스에서. 내 첫 번째 추측은 디스플레이가 시작되지 않았다는 것이 문제 였기 때문에 인터페이스를 만들었고 국가 생성자에서 비어있는 새 디스플레이를 만들어 나중에 덮어 쓰게되었습니다.
public Country() {
influence = 0;
display = new DisplayInterface() {
public void update() {}
}
}
하지만 나는 이런 식으로도 운이 없었습니다. 이런 상호 참조는 허용되지 않는 것 같네요? 뷰가 변수로 모델을 가지고 있고 그 반대의 경우도 마찬가지입니다. 개별적으로보기에 메소드를 호출하면 (같은 :
italy.setInfluence(3);
italyDisplay.displayTheCurrentValue();
을)이 작동하므로 문제가 관찰자의 논리에 확실히이다.
원본 코드가 괜찮은 것 같습니다. 'update'를 호출 할 때'display' 필드가 올바르게 초기화되었는지 확신합니까? 확실하게'display.update()'를 호출하기 직전에 디버깅 포인트 (log /'Window.alert')를 추가하는 편이 낫다. (또한'null'로 초기화된다.) 또 다른 가능한 함정 :'setDisplay' 메쏘드는'display'를 매개 변수로 사용합니다 - 당신은 그것이 표시 필드를 막지 않는 것이 확실합니까? – adamk
와우, 멋진 캐치 adamk. 원래 코드에서 저는 여기에서했던 것처럼 영향력 값을 설정하는 대신 Country 생성자에서 setInfluence 메서드를 사용했습니다. 그리고 초기화 전에 그것을 수행했습니다. 이제 나는 처음에 그 질문을 부끄러워했다. 감사합니다. 답변을 게시 할 수 있도록 허용합니다. –
질문에 대한 답변이 아니지만 코드가 GWT 팀이 GWT의 다음 버전에서 소개하는 MVP 패턴과 매우 유사하게 보입니다. 아마도 http://code.google.com/webtoolkit/articles/mvp-architecture.html을 살펴 보길 원할 것입니다. 그것은 많은 것들을 명확하게 단순화합니다! – monzonj