2014-10-16 1 views
2

GUI 빌드에서 사용하기 위해 많은 클래스를 만들고 있습니다. 따라서 JavaBean 패턴을 따라야합니다. 이것은 initialising에 관한 나를 위해 몇 가지 문제를 만들었습니다. 종종 상태가 설정되면 실행해야하는 꽤 시간 집약적 인 방법이 있습니다.JavaBean 초기화하기

하나의 접근법은 init() 메소드를 실행해야한다는 것을 문서화하고 사람들이 읽고 존중하기를 바라고 있지만 이는 어색하고 GUIBuilder를 의도 한대로 사용할 수 없다는 것을 의미합니다. 첨가되는.

나는 Bloch의 "Effective Java"를 점검했고, 물론이 포럼과 Dr Google에 질문했지만, 나는 아무 것도 생각해 내지 못했다. 공평하게 말하자면, 그것은 약간의 검색 용어 모음입니다.

다음 간단한 예제 (분명히 간단히 설명 함)는 나의 현재 접근법을 보여줍니다. "isInitialised"변수가 있고 setter가 호출 될 때마다 인스턴스가 무효화됩니다. 계산 된 변수 (또는 다른 복잡한 메소드)에서 getter가 호출 될 때마다 isInitialised 변수가 점검되고 필요한 경우 init() 메소드가 호출됩니다.

이 접근법에는 여러 가지 문제점이 있습니다. 예를 들어, 확장되지 않습니다 (일부는 실제로 확장 될 예정입니다). 또한 여기에 세 가지 변수 만있는 간단한 사례 만 보여줍니다. 진짜 수업에는 더 많은 것이 있습니다. 상황이 엉망이되고있다.

누구나 내가 GUI 빌더에서 예상대로 작동하도록 코드를보다 우아하고 읽기 쉽게 유지할 수있는 다른 방법이나 패턴을 제안 할 수 있습니까?

P. 변경 될 수 있습니다.


내가 포인트를 조금 숨겨 평범 의해

내가 생각

을 편집했다.

트릭은 모든 것이 설정된 경우에만 init() 작업을 한 번만 실행하려고합니다. 빌더 패턴을 사용했다면, build() 메소드에 넣으므로 쉽게 할 수 있습니다. 그러나 이것은 GUI 요소에 있으며 JavaBean 패턴에도 있습니다.

위의 코드는 내가 사용하고있는 "패턴"의 평범한 버전입니다. 패턴은 작동하지만, 특히 확장 성 (즉, 단어입니까?)과 변수의 수가 증가함에 따라 앞서 지적한 많은 약점이 있습니다. 간단한 예제는 괜찮아 보이지만 실제 코드는 끔찍한 것처럼 보입니다.

이것은 자바 빈즈 패턴의 단점 일 수 있다고 생각하지만, 패키지에 12 개의 더티 클래스를 만들기 전에 요청할 것입니다.

+0

클래스가 변경 가능하므로 이전에 계산 된 결과가 속성이 변경 될 때 즉시 무효화됩니까? 아니면 계산을 다시 수행하기 전에 다시 설정해야합니까? 즉, 빈이 업데이트 될 때 항상 모든 속성을 설정합니까? – Vegard

답변

1

단순한 접근 : setter에서 init()을 호출하지 않는 이유는 무엇입니까?

조금 더 화려한 : PropertyChangeSupport 개체를 사용하십시오. 샘플 사용 :

import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.beans.PropertyChangeSupport; 

public class TestBean implements PropertyChangeListener{ 
    private int someValue; 
    private PropertyChangeSupport changeSupport; 

    public TestBean() { 
     changeSupport = new PropertyChangeSupport(this); 
     changeSupport.addPropertyChangeListener(this); 
    } 

    private void init() { 
     //do something time consuming, maybe even on a different thread, using Futures? 
    } 

    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     init(); 
    } 

    public int getSomeValue() { 
     return someValue; 
    } 

    public void setSomeValue(int someValue) { 
     int oldValue = this.someValue; 
     this.someValue = someValue; 
     changeSupport.firePropertyChange("someValue", oldValue, someValue); 
    } 
} 
+0

답변 해 주셔서 감사합니다. 불행하게도 이것은 꼭 필요한 것보다 init()에 대한 호출이 많아진다. 계산에는 많은 시간이 소요되므로 바람직하지 않습니다. – timbo

+1

이미'init'되어 있는지 한번 추적 할 수 있습니다. –

+0

스윙 GUI입니까? Event Dispatch Thread가 게터에 대한 계산 방식을 사용하여 계산이 완료 될 때까지 기다리는 것을 차단하여 응답하지 않는 응용 프로그램을 남겨 둘 수있는 것처럼 들릴 수 있습니다. – Vegard

0

나는 달성하려고 노력하고있는 것을 받아 들여야한다고 생각합니다. 블로흐의 "Effective Java"에서 인용 한 내용은 다음과 같습니다.

불행히도 JavaBeans 패턴은 소유의 심각한 단점이 있습니다.구성이 여러 호출로 분할되어 있기 때문에 JavaBean 은 구성 과정 중 일부에서 일관성이없는 상태 일 수 있습니다. 클래스에는 생성자 매개 변수의 유효성을 확인하기 만하면 에 의해 일관성을 적용하는 옵션이 없습니다.

내 질문에 정확히 대답하지는 않지만 isinitialized 변수를 둘러싼 모든 대답은 Bloch에서 설명한 문제와 관련이 있다고 생각합니다.