중첩 클래스는 다른 클래스 내부에 정의된 클래스입니다. 이들은 다음과 같습니다:
익명 클래스 예시:
Button b = new Button(); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 클릭 시 동작 } });
특징:
내부 (비정적) 클래스가 정적 메서드나 변수를 포함할 수 있습니까?
답변: 아닙니다. 상수(static final)를 제외하고는 포함할 수 없습니다. 정적 중첩 클래스만 static 멤버를 가질 수 있습니다.
예시 (오류):
class Outer { class Inner { static int x = 10; // 컴파일 오류! } }
올바른 방법:
class Outer { static class StaticNested { static int x = 10; // OK } }
이야기
안드로이드 애플리케이션에서 내부 클래스를 이벤트 핸들러로 사용했습니다. 핸들러는 static 필드에 저장되어 Activity에 대한 암시적 참조를 유지하여 Activity가 파괴될 때 메모리 누수가 발생하여 애플리케이션이 "흘러" 나기 시작하고 OutOfMemoryError에 이르렀습니다.
이야기
한 마이크로서비스에서 외부 변수 반복자에 참조되는 익명 클래스를 사용했습니다. 리팩토링 후 변수들이 effectively final이 아니게 되어 코드가 컴파일되지 않게 되었고, 개발자들은 이 제한을 기억해낼 때까지 원인을 오랫동안 찾았습니다.
이야기
라이브러리에서 내부 클래스 내에 정적 변수를 사용하여 일반적인 관행이라고 생각했습니다. 새로운 JDK 버전에서 기준이 더 엄격하게 결정되어 프로젝트가 더 이상 컴파일되지 않았고, 아키텍처를 긴급하게 재작업해야 했습니다.