2014-11-18 4 views
1

개인 필드와이 필드에 대한 설정 메소드가있는 중첩 (정적) 클래스가 있습니다. fieldA가 를 액세스 할 수 있기 때문에 중첩 된 클래스의 필드를 실제 비공개로 만들려면 어떻게해야합니까?

public class Outer{ private static class Inner{ // List node private String fieldA; // ...other members... public void setA(String fieldA) { //.. do importent stuff before setting fieldA this.fieldA = fieldA; } } } 

이제 우리는 직접
이 (그리고 세터 방법 setA으로) 외부 클래스로 필드 fieldA개인하지만 버그를 가지고 있었다. 필드에 직접 액세스하는 대신 setter 메서드를 사용하도록 개발자에게 적용하려면 어떻게해야합니까?

관련 항목 : Access modifiers inside a private static nested class in Java은 의도적으로 설계된 것입니다. 그러나 외부 클래스에 의한 setter 메서드 사용을 보장하기위한 해결 방법이 있습니까?

+0

** 중첩해야합니까? 외부 코드가 변수에 액세스 할 수 있으므로 중첩되어 있기 때문에 아마 문제 일 것이라고 생각합니다. 그 중첩 된 클래스를 꺼내면 원하는 방식으로 동작합니다. –

+0

나는 그것을 옮길 수 있었다. 그러나이 패키지의 다른 모든 클래스는이 (이전 중첩 된) 클래스를 볼 수 있습니다. 그러나 중첩 된 클래스는 외부 클래스에서만 사용됩니다. – thersch

답변

3

클래스를 Outer 외부로 옮겨서는 안되는 경우 Inner에 대한 인터페이스를 정의하고이를 사용해야합니다. 인스턴스가 적고 응용 프로그램의 성능에 중요한 요소가 아닌 경우 해당 인터페이스의 익명 구현을 만들면됩니다. 클래스는 더 이상 정적이 아니지만 최소한 짧고 읽기 쉬운 솔루션입니다.

private static interface Inner { 
    void setA(String a); 
} 

private static Inner createInner() { 
    return new Inner() { 
     private String a; 

     @Override 
     public void setA(String a) { 
      this.a = a; 
     } 
    }; 
} 

클래스를 정적으로 유지하려면 외부 클래스에서 아무것도 숨길 수있는 옵션이 많지 않습니다. 내부 클래스를 신중하게 사용해야한다는 사실을보다 분명하게 알 수 있습니다.

그것은 조금 이상한 보이지만, 다음 예에서와 같은 인터페이스로 구현을 움직일 수 - 정말 Inner.InnerImpl를 사용하지 못하도록하지 않지만, 클래스 InnerImplInner에 속하고없는 것을 의미한다 직접 사용하십시오.

public class Outer{ 

    private static interface Inner { 

     static class InnerImpl implements Inner { 

      private String a; 

      @Override 
      public void setA(String a) { 
       this.a = a; 
      } 
     } 

     void setA(String a); 

    } 

    // either instantiate directly or again wrap it in a `createInner()` method 
    // Inner inner = new Inner.InnerImpl(); 
} 

사실 여기에 또 다른 아주 간단한 방법입니다. 이 특별한 경우에 실수로 속성을 사용하는 것을 방지하기 위해 새로운 명명 규칙을 도입하는 것이 정당하다고 생각합니다.

private static class Inner { 

    private String _a; 

    public void setA(String a) { 
     this._a = a; 
    } 

} 
+1

+1 당신의 독창성. 모든 제안은 좋은 아이디어입니다. 그러나 마지막 하나가 최고입니다. 다른 사람들만큼 안전하지는 않지만 읽을 만하면됩니다. 감사. – thersch

+0

그래, 나도 그렇게 생각한다. 너무 복잡하면 혼란이 더 커질뿐입니다. _ 간단하게 말해주세요, stupid_ :) – Kapep