익명 클래스 및 정적 내부 클래스에 대한 최상의 방법 (설계 및 성능 현명한)은 무엇입니까?내부/익명 클래스에 대한 우수 사례
개인적으로 정적 인 내부 클래스는 더 나은 캡슐화를 제공하고 클래스 외부의 최종 변수에 액세스 할 수 없으므로 성능을 향상시켜야한다고 생각합니다. 그러나 나는 결코 이것을 의문의 여지가 없다.
나는 이것에 대해 하나의 게시물을 발견했지만 실제로 질문에 대한 답변을 얻지 못했다고 느꼈다.
익명 클래스 및 정적 내부 클래스에 대한 최상의 방법 (설계 및 성능 현명한)은 무엇입니까?내부/익명 클래스에 대한 우수 사례
개인적으로 정적 인 내부 클래스는 더 나은 캡슐화를 제공하고 클래스 외부의 최종 변수에 액세스 할 수 없으므로 성능을 향상시켜야한다고 생각합니다. 그러나 나는 결코 이것을 의문의 여지가 없다.
나는 이것에 대해 하나의 게시물을 발견했지만 실제로 질문에 대한 답변을 얻지 못했다고 느꼈다.
내부 클래스가 둘러싸는 클래스의 필드와 익명 클래스 등의 방법으로 정확히 같은 액세스 할 수 이해하기 정적 내부 클래스 간의 차이 (행위 (중첩 된 클래스라고도 함) 및 (정규, 비 정적) 내부 클래스는 정적 클래스가 뭔가를 액세스하기 위해 포함 된 클래스의 인스턴스에 대한 명시 적 참조가 필요하다는 것입니다. 물론 그렇게해야 할 때는 대개 내부 클래스를 작성한 둘러싼 클래스의 인스턴스에 있으므로 정적이 아닌 내부 클래스를 사용하는 것이 더 쉽고 명확합니다.
예 :
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 : ... 올바른 코드를 먼저 써라 ... – Jayan
정적이 없다. 내부 클래스는 부모 클래스 멤버에 액세스 할 수 없으므로 (정적이 아닌 멤버는 정적 컨텍스트에서 액세스 할 수 없습니다).우리는 그것들을 정적 중첩 클래스라고 부르며 최상위 레벨 또는 독립적 클래스처럼 작동합니다. –
@LeninkumarKoppoju 사실, 그것들은 중첩 된 클래스라고 불리며 나중에 올바른 이름을 배웠습니다. 나는 대답을 업데이트 할 것이다. 그러나, 중첩 된 클래스는 그 클래스의 인스턴스에 대한 참조를 포함하는 둘러싸는 클래스의 멤버에 액세스 할 수 있습니다. 즉, 다른 외부 클래스에서는 불가능한'outer.privateInt = 42; '가 작동합니다. –
자바 소스 코드 모음 그들이 JDK 디렉토리에있는 src.zip에 (샘플을 가지고 패턴에서 보라. 이클립스에서 책 Effective Java 읽기 인라인 도움말
와 코드를 읽을 수있다, 봐 static
, inner
및 기타 유용한 interface
, enum
및 다른 클래스를 작동하는 방법 내부 클래스에 대한는 (정적 여부)
해당 상황에서 성능에 대해 생각하지 않았습니다. 그러나 디자인 : 디자인은 기능을 따른다. 나는 정적 내부가 "모범 사례"이고 다른 곳이 익명 인 시나리오가 있다고 생각합니다. – Fildor
성능은 아마도 무시할 수있을 것입니다 ...하지만 좀 궁금합니다. – David