programing

Java에서 스태틱네스트 인터페이스가 사용되는 이유는 무엇입니까?

nicescript 2022. 7. 6. 22:10
반응형

Java에서 스태틱네스트 인터페이스가 사용되는 이유는 무엇입니까?

코드 베이스에서 스태틱네스트 인터페이스를 찾았습니다.

class Foo {
    public static interface Bar {
        /* snip */
    }
    /* snip */
}

이런 건 처음 봐요.원래 현상기가 닿지 않습니다.따라서 SO에게 질문해야 합니다.

스태틱 인터페이스의 배후에 있는 의미는 무엇입니까?static가가왜 왜런 을? ???

위의 예의 static 키워드는 용장(네스트된 인터페이스는 자동적으로 「스태틱」)으로, 의미론에는 영향을 주지 않고 삭제할 수 있습니다.삭제하는 것을 추천합니다.인터페이스 메서드의 'public'과 인터페이스 필드의 'public final'도 마찬가지입니다.수식자는 용장성이 있어 소스 코드에 복잡함만 더합니다.

어느 쪽이든 개발자는 Foo라는 이름의 인터페이스를 선언하고 있을 뿐입니다.바. Foo에 액세스할 수 없는 코드를 제외하고, 동봉 클래스와의 연관성은 더 이상 없습니다.바코드 중 하나입니다. (소스 코드 - 바이트 코드 또는 반사에서 Foo에 액세스할 수 있습니다.Foo가 패키지 전용인 경우에도 바!)

외부 클래스에서만 사용할 것으로 예상되는 경우 새 최상위 이름을 작성하지 않도록 이 방법으로 중첩 인터페이스를 작성하는 것이 좋습니다.예를 들어 다음과 같습니다.

public class Foo {
    public interface Bar {
        void callback();
    }
    public static void registerCallback(Bar bar) {...}
}
// ...elsewhere...
Foo.registerCallback(new Foo.Bar() {
    public void callback() {...}
});

이 질문에 대한 답변은 완료되었지만 네스트인터페이스를 사용하는 이유 중 하나는 그 기능이 해당 클래스와 직접 관련되어 있는지 여부입니다.로는 「」를 들 수 있습니다.ListenerFoo 수 , 른 、 른 、 른 、 음 、 음 、 음 、 음 、 음 、 음 、 named named named named named named named named named named named named named named named named named named an an an an an an an an an an an an an an an an an an an an an an an 。FooListener이지만, 를 선언하고 에서 """를 구현하도록 이 더 할 수 있습니다Foo.Listener 클래스('네스트 클래스')Foo.Event」를 참조해 주세요).

멤버 인터페이스는 암묵적으로 스태틱합니다.이 예의 스태틱 수식자는 코드의 의미를 변경하지 않고 삭제할 수 있습니다.Java Language Specification 8.5.1 도 참조해 주세요. 정적 멤버 유형 선언

내부 인터페이스에 액세스 하려면 , 스태틱할 필요가 있습니다.자체와 되어 있기 「」로 할 수 .Foo.Bar다음과 같이 합니다.

public class Baz implements Foo.Bar {
   ...
}

대부분의 경우, 이것은 정적 내부 계층과 다르지 않습니다.

Jesse의 답변은 비슷하지만, 내부 인터페이스가 유용한 이유를 증명할 수 있는 더 좋은 코드가 있다고 생각합니다.읽기 전에 아래 코드를 확인하십시오.내부 인터페이스가 유용한 이유를 찾을 수 있습니까?정답은 클래스 DoSomethingAlready는 구체적인 클래스 Zoo뿐만 아니라 A와 C를 구현하는 클래스에서도 인스턴스화할 수 있다는 것입니다.물론 AC가 내부가 아니더라도 이를 달성할 수 있지만 긴 이름(A와 C뿐만 아니라)을 연결하고 다른 조합(A와 B, C와 B 등)에 대해 이 작업을 수행한다고 가정하면 어떻게 일이 통제 불능 상태가 되는지 쉽게 알 수 있습니다.소스 트리를 리뷰하는 사람들은 한 클래스에서만 의미가 있는 인터페이스에 압도당합니다.즉, 내부 인터페이스는 커스텀유형의 구축을 가능하게 하고 캡슐화를 개선합니다.

class ConcreteA implements A {
 :
}

class ConcreteB implements B {
 :
}

class ConcreteC implements C {
 :
}

class Zoo implements A, C {
 :
}

class DoSomethingAlready {
  interface AC extends A, C { }

  private final AC ac;

  DoSomethingAlready(AC ac) {
    this.ac = ac;
  }
}

당신의 질문에 매우 직접적으로 대답하려면 지도를 보세요.엔트리

Map. 엔트리

또한 이것은 유용할 수 있다.

스태틱 네스트된 Inerfaces 블로그 엔트리

일반적으로 정적 내부 클래스가 보입니다.static 내부 클래스는 non-static 클래스가 가능한 포함 클래스를 참조할 수 없습니다.패키지의 충돌(Foo와 같은 패키지에 Bar라는 인터페이스가 이미 있음)이 없는 한, 독자적인 파일로 할 수 있다고 생각합니다.Foo와 Bar 사이의 논리적 연결을 강제하기 위한 설계 결정일 수도 있습니다.아마도 필자는 Bar를 Foo에서만 사용하려고 했을 것이다(정적인 내부 인터페이스는 이것을 강제하지는 않지만, 단지 논리적인 연결일 뿐이다).

클래스 Foo를 인터페이스 Foo로 변경하는 경우 위의 예의 "public" 키워드도 용장화 됩니다.

다른 인터페이스 내에 정의되어 있는 인터페이스는 암묵적으로 스태틱을 공개합니다.

1998년에 Philip Wadler는 스태틱인터페이스와 비 스태틱인터페이스의 차이를 제안했습니다.

인터페이스를 비정적으로 만드는 유일한 차이점은 비정적 내부 클래스를 포함할 수 있다는 것입니다.이러한 변경으로 인해 기존 Java 프로그램이 무효화되지는 않습니다.

예를 들어, 그는 표현 문제에 대한 해결책을 제시했는데, 이는 한편으로는 "당신의 언어가 얼마나 표현할 수 있는가"라는 표현과 "당신이 표현하려는 용어"라는 표현 사이의 불일치입니다.

스태틱 네스트인터페이스와 비 스태틱네스트인터페이스의 차이의 예를 다음에 나타냅니다.

// This code does NOT compile
class LangF<This extends LangF<This>> {
    interface Visitor<R> {
        public R forNum(int n);
    }

    interface Exp {
        // since Exp is non-static, it can refer to the type bound to This
        public <R> R visit(This.Visitor<R> v);
    }
}

그의 제안은 Java 1.5.0에서는 실현되지 않았습니다.따라서 다른 답변은 모두 정답입니다.스태틱네스트 인터페이스와 비스태틱네스트 인터페이스에는 차이가 없습니다.

Java에서는 스태틱인터페이스/클래스를 사용하면 인터페이스/클래스를 최상위 클래스처럼 사용할 수 있습니다.즉, 다른 클래스에서 선언할 수 있습니다.다음 작업을 수행할 수 있습니다.

class Bob
{
  void FuncA ()
  {
    Foo.Bar foobar;
  }
}

스태틱이 없으면 위의 컴파일은 실패합니다.이 방법의 장점은 인터페이스를 선언하는 데만 새로운 소스 파일이 필요하지 않다는 것입니다.또한 Foo를 써야 하므로 인터페이스 바를 Foo 클래스에 시각적으로 연관짓습니다.Foo 클래스가 Foo 인스턴스를 사용하여 작업을 수행함을 나타냅니다.바.

Java의 클래스 유형에 대한 설명입니다.

Static은 포인터를 사용하지 않고도 패키지(프로젝트)의 클래스 부분에 액세스할 수 있음을 의미합니다.이것은 상황에 따라 유용하거나 방해가 될 수 있습니다.

"static" 메서드의 완벽한 예는 수학 수업입니다.산술의 모든 방법은 정적입니다.즉, 새로운 인스턴스를 만들고 변수를 선언하고 더 많은 변수에 저장할 필요가 없습니다. 데이터를 입력하면 결과를 얻을 수 있습니다.

정전기라고 해서 항상 쓸모 있는 것은 아닙니다.예를 들어 대소문자를 비교할 경우 데이터를 여러 가지 방법으로 저장할 수 있습니다.동일한 시그니처를 사용하여3개의 스태틱메서드를 작성할 수 없습니다.스태틱하지 않은 3가지 인스턴스가 필요합니다.그 다음 비교하고 비교할 수 있습니다.스태틱한 경우 입력에 따라 데이터가 변경되지 않습니다.

정적 방법은 일회성 반환 및 빠른 계산 또는 쉽게 얻을 수 있는 데이터에 적합합니다.

언급URL : https://stackoverflow.com/questions/71625/why-would-a-static-nested-interface-be-used-in-java

반응형