source

Java에서 익명 내부 클래스를 정적으로 만들 수 있습니까?

factcode 2022. 9. 11. 17:09
반응형

Java에서 익명 내부 클래스를 정적으로 만들 수 있습니까?

로 할 수 .static그렇지 않으면.만약 그렇다면static포함된 인스턴스의 포인터에 대한 참조는 포함되어 있지 않습니다(이러한 클래스는 내부 클래스라고도 불리지 않고 중첩된 클래스라고도 불립니다).

클래스 .static이 참조가 필요하지 않은 경우 가비지 수집 또는 이스케이프 분석에 문제가 발생할 수 있습니다.

내부 「」를 수 ?static합니까(에 가능또는 컴파일러는 이것을 자동으로 검출합니까(서브클래스는 존재할 수 없기 때문에 검출할 수 있습니다).

예를 들어 익명의 대조군을 만들 경우 외부 참조가 거의 필요하지 않습니다.

  Collections.sort(list, new Comparator<String>(){
       int compare(String a, String b){
          return a.toUpperCase().compareTo(b.toUpperCase());
       }
  }

그래서 를 항상 있는 FindBugs할 것을 권장합니다.static인 「」를 하지 않는 )this★★★★★★ 。

편집: Tom Hawtin - tackline은 익명 클래스가 정적 컨텍스트(예:main method) 。static그러나 JLS는 동의하지 않는다.

' 클래스는abstract1. (제8.1.1.1항).1.이며, 내부 클래스('8.1.3')가 .static (제8.1.1절, 제8.5.1절). 암묵적으로 '어나니머스'입니다.final1. (제8.1.1.2항).

Roedy Green의 Java Glossary는 정적 컨텍스트에서 익명 클래스가 허용된다는 사실은 구현에 따라 다르다고 말합니다.

하고 있는 , 되어 있습니다.javac.exe에서는, 됩니다.static 및 " " " 입니다.static 클래스가 더 하는 것은 클래스가 .static물론 이러한 익명 클래스는 객체의 인스턴스 필드에 액세스할 수 없습니다.나는 이것을 하는 것을 추천하지 않는다.기능은 언제든지 풀 수 있습니다.

편집 2: JLS는 실제로는 § 15.9.2에서 스태틱콘텍스트를 더 명확하게 다루고 있습니다.

C를 인스턴스화하는 클래스로 하고 i를 만드는 인스턴스로 합니다.C가 내부 클래스일 경우 바로 둘러싸인 인스턴스가 있을 수 있습니다.바로 둘러싸인 i(38.1.3)의 인스턴스(instance)는 다음과 같이 결정된다.

  • C가 어나니머스 클래스일 경우:
    • 클래스 인스턴스 작성식이 스태틱콘텍스트(「8.1.3」)에서 발생하는 경우는, 즉시 instance를 둘러싸지 않습니다.
    • 그렇지 않은 경우 i의 바로 둘러싸인 인스턴스는this.

, 으로 「」, 「」, 「어나니머스 는,static 말하면 클래스도 ' 클래스'에 static를 누릅니다

나는 여기 명명법에 약간의 혼란이 있다고 생각한다, 그것은 분명히 너무 어리석고 혼란스럽다.

이러한 패턴(및 가시성이 다른 몇 가지 변형)은 모두 가능한 일반 Java입니다.

public class MyClass {
  class MyClassInside {
  }
}

public class MyClass {
  public static class MyClassInside {
  }
}

public class MyClass {
  public void method() {
    JComponent jc = new JComponent() {
      ...
    }
  }
}

public class MyClass {
  public static void myStaticMethod() {
    JComponent jc = new JComponent() {
      ...
    }
  }
}

언어 사양으로 대응하고 있습니다(정적인 방법에 대해서는 섹션 15.9.5.1을 참조해 주세요.

하지만 이 인용문은 완전히 틀렸습니다.

javac.exe는 어나니머스 클래스가 스태틱하지 않다고 언어 사양에 기재되어 있어도 스태틱 초기화 코드 및 스태틱 메서드 내의 익명 클래스를 허용합니다.

인용된 작성자가 static 키워드와 static context를 혼동하고 있는 것 같습니다.(JLS도 이 점에서 조금 혼란스럽다고 인정합니다.)

솔직히 위의 모든 패턴은 정상입니다(무엇을 "내성", "내성", "익명"이라고 부르든 상관없습니다).실제로 다음 Java 릴리즈에서 이 기능을 갑자기 제거할 사람은 없습니다.정말!

약간.스태틱 메서드로 작성된 어나니머스 내부 클래스는 외부 발신원이 없기 때문에 확실히 스태틱합니다.

스태틱 콘텍스트의 내부 클래스와 스태틱네스트 클래스에는 기술적인 차이가 있습니다.흥미가 있는 경우는, JLS 제3판을 읽어 주세요.

내부 클래스는 정적일 수 없습니다. 정적 중첩 클래스는 내부 클래스가 아닙니다.Java 튜토리얼에서는 여기에 대해 설명합니다.

어나니머스 내부 클래스는 스태틱하지 않습니다(스태틱메서드 또는 최종 이외의 스태틱필드는 선언할 수 없습니다).단, 스태틱콘텍스트(스태틱메서드 또는 스태틱필드)에 정의되어 있는 경우, 엔클로징 클래스의 비 스태틱(인스턴스) 멤버에 액세스 할 수 없다는 의미에서 스태틱한 것처럼 동작합니다(스태틱콘텍스트의 다른 모든 것과 같음).

스태틱 메서드 내에서 어나니머스 내부 클래스를 호출하여 스태틱하게 하는 점에 유의합니다.

이렇게 해도 실제로 참조가 제거되지는 않습니다.이를 테스트하려면 어나니머스 클래스를 시리얼화하려고 하고 둘러싸는 클래스를 시리얼화하지 않습니다.

언급URL : https://stackoverflow.com/questions/758570/is-it-possible-to-make-anonymous-inner-classes-in-java-static

반응형