2013-07-25 2 views
0

PropertyChangeSupport을 확장하는 클래스를 만들고 있습니다. 그것이 의해 PropertyChangeSupport에서 구현으로하위 클래스의 비공개 필드에 액세스

firePropertyChange을 :

public void firePropertyChange(String propertyName, Object oldValue, Object newValue) { 
    if (oldValue == null || newValue == null || !oldValue.equals(newValue)) { 
     firePropertyChange(new PropertyChangeEvent(this.source, propertyName, oldValue, newValue)); 
    } 
} 

firePropertyChange의 내 구성 재정의 :

public void firePropertyChange(String propertyName, Object oldValue, Object newValue) { 
    if (oldValue == null || newValue == null || !oldValue.equals(newValue)) { 
     firePropertyChange(new JoystickPropertyChangeEvent(this.source, propertyName, oldValue, newValue)); //compile error: source is not visible 
    } 
} 

JoystickPropertyChangeEvent 내가 만든 클래스이며, 내가 현재하고 싶은 firePropertyChange()를 오버라이드 (override)입니다 확장하여 ProperyChangeEvent입니다.

소스가 비공개이고 PropertyChangeSupportgetters이 없으므로 의도 한 구현이 컴파일되지 않으므로 하위 클래스에 액세스 할 수 없습니다. PropertyChangeSupport의 코드를 수정할 수 없습니다.

소스의 복사본을 내 서브 클래스의 필드로 사용하는 것보다 더 우아한 해결책이 있습니까?

관련 질문 : How to access the private variables of a class in its subclass?

답변

1

내가이의 디자인에 의문을 제기한다.

재정의하려는 메소드가 이유 때문에 비공개로 설정되었지만 구현을 변경할 수 있더라도 다른 곳에서 어떤 영향을 미치는지 모르기 때문에 조언하지 않습니다.

+0

나는 네가 완벽하다고 생각한다. – deinocheirus

-1

당신은 즉

super.firePropertyChange(new JoyStickPropertyChangeEvent(super.getSource, propertyName, oldValue, newValue); 

이 트릭을 할해야 source 속성을 얻으려면 슈퍼 클래스의 게터-방법을 사용할 수 있습니다. 설명으로 명시 적으로 super 클래스의 firePropertyChange 메소드를 호출해야합니다. 이 작업은 키워드 super로 수행됩니다. 당신은 정말 바보라면

희망이 당신이 반사와 함께이 문제를 해결하기 위해 시도 할 수 있습니다,

건배

+0

이 메소드를 호출하지만 구현을 변경하지는 않습니다. public void firePropertyChange (String propertyName, Object oldValue, Object newValue);를 호출합니다. 여전히 잘못된 메소드가 호출됩니다. – StuPointerException

+0

문서에서이 방법이 비공개로 선언 된 것을 볼 수 없습니까? [http://docs.oracle.com/javase/6/docs/api/java/beans/PropertyChangeSupport.html#firePropertyChange(java.beans.PropertyChangeEvent)] (링크)에 따라 'public void firePropertyChange (PropertyChangeEvent evt) . 어쩌면 수퍼 클래스의 getSource-Method는 private이지만 그 자체로이 메소드를 구현해야한다. – ZeusNet

1

을하는 데 도움이됩니다. 하지만 너무 복잡해서 다시는 언급하지 않겠습니다.

속성 변경 청취자가 다른 이벤트와 다른 이벤트를 구분할 수 있도록하는 것이 목표 인 것 같습니다. 청취자가 도움없이 따로 말할 수 있다면, 그렇게하십시오. 그게 불편하다면 속성 변경 이벤트를 분석하고 JoystickPropertyChangeEvent이어야하는지 여부를 반환하는 정적 메서드를 제공하십시오.

왜 속성 변경 이벤트를 사용해야합니까? 조이스틱 상태가 업데이트 될 때 이벤트를 시작하려면 사용자 정의 이벤트를 실행해야합니다.

0

이 용도로 리플렉션을 사용할 수 있습니다.

에 ParentClass 전용 변수가 ChildClass에에 부모 클래스 다음

ParentClass obj = new ParentClasS(); 
Field f = obj.getClass().getDeclaredField("private_source_parent"); //NoSuchFieldException 
f.setAccessible(true); 
String source_inchild = (String) f.get(obj); 

을 확장하여 ChildClass에 내부

private String private_source_parent = "some_value"; 

같은 경우는 부모 개인 멤버의 값을 얻을 것이다.

+2

정말 문제를 해결할 다른 방법이없는 경우에만해야 할 끔찍한 해킹입니다. – Jesper

+0

이 해킹이 없으면 자식 클래스에서 getter 메서드없이 부모 클래스의 개인 데이터 멤버에 액세스하는 다른 방법이 있습니까? – pikrut

+0

아마도 그렇지 않습니다. 그러나 deinocheirus가 갖고있는 문제에 대한 해법은 그의 코드를 리팩터링하는 것이므로 해킹하는 대신에 이것이 필요하지 않습니다. – Jesper

1

PropertyChangeSupport을 연장 했으므로 을 생성자로 올바르게 호출하고 있습니까? PropertyChangeSupport의 원래 생성자는 source (즉, 빈)을 인수로 사용합니다.

.

sourceBean 인수는 원하는 source입니다. 자신의 개인 회원을 사용하여 해당 참조를 저장하십시오. 그런 다음 firePropertyChange() 메소드 내에서 사용할 수 있습니다.

public static class MyPropertyChangeSupport extends PropertyChangeSupport { 
    private Object mySource; 

    public MyPropertyChangeSupport(Object sourceBean) { 
     super(sourceBean); 
     // store the bean reference in your field 
     this.mySource = sourceBean; 
    } 

    @Override 
    public void firePropertyChange(String propertyName, Object oldValue, Object newValue) { 
     if (oldValue == null || newValue == null || !oldValue.equals(newValue)) { 
      // use mySource here 
      firePropertyChange(new JoystickPropertyChangeEvent(mySource, propertyName, oldValue, newValue)); 
     } 
    } 
} 
+0

"자신의 비공개 멤버를 사용하여 해당 참조를 저장하십시오." 가능하다면 제가 피하고 싶었던 것입니다. – deinocheirus

+0

사용하려는 경우 피할 수 없습니다. 다른 접근 방식, 즉 반사는 클래스를 망칠 것입니다. 당신이 그것을 피하고 싶은 특별한 이유가 있습니까? –

관련 문제