IT이야기

Java: 새 키워드와 인터페이스 어떻게 그게 가능합니까?

cyworld 2021. 10. 28. 19:19
반응형

Java: 새 키워드와 인터페이스 어떻게 그게 가능합니까?


Java 라이브러리에서 일부 소스 코드를 읽고 있었는데 여기서 혼란스럽습니다.

이 코드는 jaxb 라이브러리의 Document.java에서 가져온 것이고 ContentVisitor는 동일한 패키지의 Interface입니다. 새 키워드로 Interface의 인스턴스를 어떻게 만들 수 있습니까? 불법아닌가요?

public final class Document {
.
.
 private final ContentVisitor visitor = new ContentVisitor() {
    public void onStartDocument() {

        throw new IllegalStateException();
    }

    public void onEndDocument() {
        out.endDocument();
    }

    public void onEndTag() {
        out.endTag();
        inscopeNamespace.popContext();
        activeNamespaces = null;
    }
}

코드에서 인터페이스의 인스턴스를 생성하지 않습니다. 오히려 코드는 인터페이스를 구현하는 익명 클래스를 정의하고 해당 클래스를 인스턴스화합니다.

코드는 대략 다음과 같습니다.

public final class Document {

    private final class AnonymousContentVisitor implements ContentVisitor {

        public void onStartDocument() {
            throw new IllegalStateException();
        }

        public void onEndDocument() {
            out.endDocument();
        }

        public void onEndTag() {
            out.endTag();
            inscopeNamespace.popContext();
            activeNamespaces = null;
        }
    }

    private final ContentVisitor visitor = new AnonymousContentVisitor();
}

유효합니다. 익명 클래스라고 합니다. 여기를 보아라

우리는 이미 익명 클래스를 정의하고 인스턴스화하는 구문의 예를 보았습니다. 그 구문을 다음과 같이 더 형식적으로 표현할 수 있습니다.

new class-name ( [ argument-list ] ) { class-body }

또는:

new interface-name () { class-body }

It is called anonymous type/class which implements that interface. Take a look at tutorial - Local and Anonymous Inner Classes.


That declaration actually creates a new anonymous class which implements the ContentVisitor interface and then its instance for that given scope and is perfectly valid.


There's something called anonymous class in java http://www.java2s.com/Code/Java/Class/Anonymous-class.htm


Do notice where the braces open - you are declaring an inner object (called anonymous class) that implements ContentVisitor and all required methods on the spot!


It is inline interface implementation.Here the idea is to have the compiler generate an anonymous class that implements the interface. Then for each method defined in the interface you can (optionally) provide a method with a suitable signature that will be used as the implementation of the interface's method.

It is the new Oxygene syntax, added to the language to allow Oxygene programmers to work with these interface-based events in much the same way as Java programmers do.


You actually have just provided the implementation of this interface in an anonymous way. This is quite common and of course possible. Have a look here for more information.

ReferenceURL : https://stackoverflow.com/questions/9157784/java-interface-with-new-keyword-how-is-that-possible

반응형