2012-09-24 2 views
6

익명 클래스 및 정적 내부 클래스에 대한 최상의 방법 (설계 및 성능 현명한)은 무엇입니까?내부/익명 클래스에 대한 우수 사례

개인적으로 정적 인 내부 클래스는 더 나은 캡슐화를 제공하고 클래스 외부의 최종 변수에 액세스 할 수 없으므로 성능을 향상시켜야한다고 생각합니다. 그러나 나는 결코 이것을 의문의 여지가 없다.

나는 이것에 대해 하나의 게시물을 발견했지만 실제로 질문에 대한 답변을 얻지 못했다고 느꼈다.

+0

해당 상황에서 성능에 대해 생각하지 않았습니다. 그러나 디자인 : 디자인은 기능을 따른다. 나는 정적 내부가 "모범 사례"이고 다른 곳이 익명 인 시나리오가 있다고 생각합니다. – Fildor

+0

성능은 아마도 무시할 수있을 것입니다 ...하지만 좀 궁금합니다. – David

답변

4

내부 클래스가 둘러싸는 클래스의 필드와 익명 클래스 등의 방법으로 정확히 같은 액세스 할 수 이해하기 정적 내부 클래스 간의 차이 (행위 (중첩 된 클래스라고도 함) 및 (정규, 비 정적) 내부 클래스는 정적 클래스가 뭔가를 액세스하기 위해 포함 된 클래스의 인스턴스에 대한 명시 적 참조가 필요하다는 것입니다. 물론 그렇게해야 할 때는 대개 내부 클래스를 작성한 둘러싼 클래스의 인스턴스에 있으므로 정적이 아닌 내부 클래스를 사용하는 것이 더 쉽고 명확합니다.

예 :

  • (비 고정)

    class A { 
        private int field; 
    
        private class B { 
         public void doSomething() { 
          field++; // Valid 
         } 
        } 
    } 
    
  • 중첩 클래스 (즉, "정적 내부 클래스")

    class A { 
        private int field; 
    
        private static class B { 
         public void doSomething(A a) { 
          a.field++; // Valid 
         } 
        } 
    } 
    
  • 익명 클래스

    내부 클래스

    class A { 
        private int field; 
    
        public void doSomething() { 
         new Runnable() { 
          @Override 
          public void run() { 
           field++; // Valid 
          } 
         } 
        } 
    } 
    

다른 접근법을 사용하는지 여부는 다른 질문입니다. 둘러싸는 클래스의 비공개 필드에 액세스하는 경우 접근자가 생성되므로 은 메소드 액세스 비용과 동일하지 않으므로은 성능에 영향을 미칠 수 있지만 무시할 수는 없습니다. 대부분의 경우. 측정을 기반으로하지 않는 마이크로 최적화를 수행하기 전에 항상 올바른 코드를 먼저 작성해야합니다 (디자인 및 기능면에서). JIT 컴파일러는 어쨌든 많은 일을합니다.

+1

+1 : ... 올바른 코드를 먼저 써라 ... – Jayan

+0

정적이 없다. 내부 클래스는 부모 클래스 멤버에 액세스 할 수 없으므로 (정적이 아닌 멤버는 정적 컨텍스트에서 액세스 할 수 없습니다).우리는 그것들을 정적 중첩 클래스라고 부르며 최상위 레벨 또는 독립적 클래스처럼 작동합니다. –

+0

@LeninkumarKoppoju 사실, 그것들은 중첩 된 클래스라고 불리며 나중에 올바른 이름을 배웠습니다. 나는 대답을 업데이트 할 것이다. 그러나, 중첩 된 클래스는 그 클래스의 인스턴스에 대한 참조를 포함하는 둘러싸는 클래스의 멤버에 액세스 할 수 있습니다. 즉, 다른 외부 클래스에서는 불가능한'outer.privateInt = 42; '가 작동합니다. –

1

자바 소스 코드 모음 그들이 JDK 디렉토리에있는 src.zip에 (샘플을 가지고 패턴에서 보라. 이클립스에서 책 Effective Java 읽기 인라인 도움말

와 코드를 읽을 수있다, 봐 static, inner 및 기타 유용한 interface, enum 및 다른 클래스를 작동하는 방법 내부 클래스에 대한는 (정적 여부)

+0

@ cl-r : 원본 링크가 저작권을 침해 한 것처럼 보입니다. 나는 amazone 링크로 바꿨다. – Jayan

+0

@ Jayan, 고마워, 나는이 문제를 몰랐다. –

+0

오래전에 나는이 책을 보았다 ... 내가 다시 보도록하자. – David