6

코드 작성이 매우 어려우나 때로는 피할 수없는 스타일입니다. 극단적 인 예입니다. 따라서Java : 중첩 클래스로 제한 하시겠습니까?

  1. 중첩 클래스에는 몇 가지 제한이 있습니까?
  2. 은 무엇입니까?
  3. 그런 상황을 어떻게 처리합니까? 라이브러리를 만드시겠습니까?

코드

new FileObject().new Format().new Words().new Some().new Continue someThing; 

((((new FileObject()).new Format()).new Words()).new Some()).new Continue someThing; 
+6

항상 피할 수 있습니다 – Bozho

+1

이 코드는 구문 상 올바로 맞습니까? – nmr

+0

특정 코드 생성 환경에서는 피할 수 없습니다. 저조한 설계된 스키마 파일에서 Jaxb를 사용할 때 심도가 한계에 다다 랐습니다 (다행스럽게도 편집 할 수 있음). – Spina

답변

5

코딩 스타일이 매우 좋지 않지만 때로는 피할 수없는 경우가 있습니다.

이 문장의 두 번째 부분은 분명히 거짓입니다.구현 레벨에서 중첩 클래스를 사용하지 않는 것이 항상 가능합니다.

디자인 이름있는 클래스를 두 개 이상의 수준으로 중첩하는 이유와 익명 클래스를 3 개 또는 4 개 수준 이상으로 생각할 수 있습니다. (난 정말 복잡한 콜백과 이클립스 RCP 응용 프로그램에서 익명의 내부 클래스의 3 또는 4 단계를 사용하여 한 시간을 기억하지.하지만 그건 정말 이상한이며, 생각해 보면 그것은 나쁜 생각이었다.)

1)입니다 중첩 클래스에 대한 제한이 있습니까?

이론적으로 제한은 정규화 된 클래스 이름에 대한 64K 제한입니다. 실제로 한계는 상식입니다.

2)는 무엇입니까?

? 중첩 클래스가 중첩되지 않은 클래스와 같은지 묻는 경우 모든 실제 의도에 대해 대답은 예 ...입니다. 일반 클래스로 수행 할 수없는 중첩 클래스로 수행 할 수있는 유일한 작업은 private으로 선언 된 항목을 공유하는 것입니다. 그리고 해결 방법은 개인 패키지에 대한 액세스를 완화하는 것입니다.

3) 어떻게 이러한 상황을 처리합니까? 라이브러리를 만드시겠습니까?

나는 어떤 상황에 대해 이야기하고 있는지 알 수 없습니다. 여러 클래스로 구성된 Java 프로그램을 모듈화하는 일반적인 방법은 클래스 중첩이 아닌 Java 패키지를 사용하는 것입니다. 그게 네가 누락 된 것이니?

3

당신이주는 예는 비 정적 중첩 클래스입니다. (중첩 클래스를 인스턴스화하려면 엔 클로징 클래스 유형의 오브젝트가 필요합니다.) 중첩 된 비 정적 클래스는 거의 사용되지 않습니다. 일반적으로 정적 중첩 클래스 또는 기본 (패키지) 범위가있는 중첩되지 않은 클래스로도 수행 할 수 있습니다.

4

바이트 코드 수준에서 중첩 된 클래스와 같은 것은 없습니다. 컴파일러는이를 합성 접근 자 메서드를 통해 부모 클래스의 메서드에 액세스 할 수있는 별도의 최상위 클래스로 변환합니다.

중첩 깊이에 대한 명시적인 제한이 없습니다. 가장 관련이있는 암시 적 제한은 포함 계층을 복제하는 생성 된 .class 파일의 이름입니다 (예 : FileObject$Format$Words$Some$Continue.class). 이것은 결국 파일 시스템에 따라 파일 이름 길이 제한으로 실행됩니다.

+0

좋은 대답은하지만 접근 자 메소드는 중첩 클래스의 메소드가 패키지 전용이 아닌 경우에만 생성된다고 생각합니다. – helpermethod

+0

@helpermethod - 그건 잘못되었습니다. 액세스 권한은 아무런 차이가 없습니다. 아마도 당신은'정적'을 생각하고있을 것입니다. –

2

중첩 된 클래스는 상태가 Inner Classes and Enclosing Instances (언어 규격)이므로 정적 내부 클래스의 일종입니다.

귀하의 경우에는 내면이 아닌 중첩 된 것으로 가정합니다.

내부 케이스의 경우 새 Toto() 표현식을 좋아하지 않기 때문에 클래스를 둘러싼 팩토리 인스턴스 메소드를 수행합니다. 새 Foo() ... foo 객체를 얻지 만 toto 객체는 어디에 있습니까?

중첩 된 경우 새 Toto.Foo.Bar.Other.And.So.On()을 수행합니다. "클래스 파일 형식"스펙에 설명 된대로

5

는 일 JVM은 UTF-8 수정 65536 바이트를 사용하여 문자열로 인코딩 된 정규화 된 클래스 이름 에 대한 의 제한이 있습니다. 'u2' 용량 (16 비트) - 상수 풀 'CONSTANT_Utf8_info'구조체 '길이'유형 은 클래스 파일에 클래스 이름을 저장하는 데 사용됩니다. maximum length for a java class name

가입일

도 (지퍼 기준) JAR 형식도 64K의 최대 파일명 길이를 갖는다. (Wikipedia, ZIP, File headers)

그래서 클래스 중첩의 한계는 이름이 64k에 도달 할 때이지만, 나는 네 정신이 그 한계에 오래 걸릴 것이라고 생각한다!

+0

나는 파일 이름의 길이를 말하며, 그 질문은 본질적으로 클래스 이름이 얼마나 오래 될 수 있는지에 관한 것이다. zip 형식은 포함 된 파일 이름을 파일 내용이 아닌 64k로 제한합니다. – mdma