2012-03-13 2 views
0

나는 자바에 익숙하지 않고 내 머리를 긁어서 개념을 이해하고있다. 자습서 Java tutorial을 따르고 있습니다. 그러나 정적 중첩 클래스 사용의 유용성을 찾을 수 없습니다. 나는 왜 내가 그것을 사용해야하는지에 관해 좋은 예가 필요하다고 생각한다. 누군가가 나를 더 잘 이해할 수 있도록 몇 가지 코드를 예제로 제공 할 수 있습니까? thaxJava의 정적 중첩 클래스 란 무엇입니까?

+3

다음을 참조하십시오. http://stackoverflow.com/questions/253492/static-nested-class-in-java-why – darijan

답변

3

"일반"클래스에 비해 정적 중첩 클래스의 이점은이 클래스를 사용하여 두 클래스 간의 관계를 반영 할 수 있다는 것입니다.

예를 들어 JDK에는 java.util.Mapjava.util.Map.Entry이 있습니다.

java.util.Map.Entrypublic static interface으로 선언되며 이런 식으로 표시하면 Map과의 관계가 명확하게 표시됩니다. java.util.MapEntry으로 정의되었을 수도 있지만 정적 중첩 인터페이스로 사용하면 Map과 강한 관계가 있음을 분명히 알 수 있습니다.

그래서 중첩 된 클래스가 부모 컨텍스트에서만 사용되는 경우 정적 중첩 클래스 만 사용합니다.

+0

이것은 정적 중첩 클래스를 프로그래밍하는 논리적 인 방법이지만 정적 중첩 클래스는 그렇지 않습니다. 부모 클래스에 대해 아무 것도 알 필요가 없습니다. 사실상 "Zoo"라는 외부 클래스를 프로그래밍 할 수 있으며 "Zoo"클래스와 아무 관련이없는 정적 중첩 클래스 "GalacticWarfare"를 가질 수 있습니다. –

0

중첩 또는 내부 클래스는 다른 클래스에 정의 된 일반 클래스입니다. 이렇게하는 이유는 일반적으로 다른 클래스에서 내부 클래스를 숨기는 것입니다. 즉 다른 클래스의 캡슐화입니다.

내부 클래스는 필드, 메서드와 완전히 동일한 의미의 개인, 보호 및 공용이 될 수 있습니다.

내부 클래스가 비공개가 아닌 경우 외부에서도 액세스 할 수 있습니다. 그것의 이름은 OuterClass.InnnerClass입니다. 중첩 깊이는 Java 사양에 의해 제한되지 않으므로 내부 클래스는 내부 클래스 등을 가질 수 있습니다.

내부 클래스가 정적이 아닌 경우 외부 함수의 클래스 메서드 및 필드를 호출 할 수있는 또 다른 기능이 있습니다.

내부 클래스도 익명 일 수 있습니다. 작은 콜백이나 이벤트 핸들러 등에 매우 유용합니다.

희망이 있습니다. 다른 구체적인 질문을 주저하지 마십시오.

1

다음 예제는 자바 초보자를위한 것은 아니지만 정적 중첩 클래스의 좋은 예는 Builder pattern을 사용하여 외부 클래스의 불변 객체를 생성하고자 할 때입니다. 정적 중첩 클래스는 외부 클래스의 private 멤버에 액세스 할 수 있으므로 외부 클래스의 객체를 구성하지만 private 생성자가 있고 외부 클래스의 private 필드를 초기화합니다. 예. 내가 추가해야

public class SomeClass { 
    private int someField; 
    private int someOtherField; 

    private SomeClass() 
    {} 

    public static class SomeBuilder { 
     private int someField; 
     private int someOtherField; 

     public SomeBuilder setSomeField(int someField) 
     { 
      this.someField = someField; 
      return this; 
     } 

     public SomeBuilder setSomeOtherField(int someOtherField) { 
      this.someOtherField = someOtherField; 
      return this; 
     } 

     public SomeClass build() throws ValidationException 
     { 
      validateFields();    

      SomeClass someClass = new SomeClass(); 
      someClass.someField = someField; 
      someClass.someOtherField = someOtherField; 
      return someClass; 
     } 

     private void validateFields() throws ValidationException { 
      //Validate fields 
     } 
    } 

    public int getSomeField() { 
     return someField; 
    } 
    public int getSomeOtherField() { 
     return someOtherField; 
    } 
} 
+0

주 - 정적 중첩 클래스는 외부 클래스의 인스턴스 변수 및 비 정적 메서드에 액세스 할 수 없습니다. –

+0

중첩 된 정적 클래스가 외부 클래스의 객체를 만드는 경우이 예제에 제공된 것처럼 외부 클래스의 모든 private 멤버에 액세스 할 수 있습니다. –

+0

오른쪽 - 내부 클래스의 기본 기능과 정적 중첩 클래스를 구별 할뿐입니다. 내부 클래스는 실제로 외부 클래스와 관계가 있으며 외부 클래스 멤버에 직접 액세스 할 수 있습니다. 정적 중첩 클래스는 그렇지 않습니다. 귀하의 예에서는 정적 중첩 클래스에 외부 클래스의 인스턴스를 만들었습니다. 그렇지 않으면 정적 중첩 클래스는 실제로 외부 클래스와의 암시 적 관계를 갖지 않습니다. –

0

또 다른 한가지는 내부 클래스가 하지 정적 인 경우의 인스턴스가 자동으로 부모 클래스의 인스턴스에 대한 참조를 가질 것입니다. 다음을 사용하여 참조 할 수 있습니다. NameOfOuterClass.this.

그러나 이 정적 인 경우이면 정적이 아닙니다.

이것은 무엇보다도 GC (가비지 수집) 중에 발생합니다. 내부 클래스의 객체가 GCed되고 있지 않으면 참조하는 외부 클래스 객체도 GCed되지 않습니다 (내부 클래스가 정적이 아닌 경우).

관련 문제