Java:新しいキーワードのインターフェイスはどのように可能ですか?

私はJavaライブラリからいくつかのソースコードを読んでいましたが、私はここで混乱しています。

このコードはjaxbライブラリのDocument.javaにあり、 ContentVisitorはインターフェイスですと同じパッケージ内に、新しいキーワードで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;
    }
}
48
おそらく、Javaプログラミング言語の最も強力な機能の1つを発見したばかりです。
追加された 著者 Mersenne,

8 答え

コードでは、インターフェースのインスタンスを作成していません。むしろ、コードはインターフェイスを実装する匿名クラスを定義し、そのクラスをインスタンス化します。

コードはおおよそ次のものと同等です:

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();
}
48
追加された
@DesignCode:主に構文的な砂糖ですが、ユニークなセールスポイントもあります。たとえば、そのようなクラスが関数内で定義されている場合、関数内で定義された final 変数にアクセスできます。
追加された 著者 NPE,
それは余分なコードを書いて、名前を思いつくことを省く。上記の例では、名前は Document $ 1 である可能性が高くなります。
追加された 著者 Peter Lawrey,
ありがとう、この構文(匿名クラス)は、私たちにいくつかの余分なコードを書かないようにするか、他の利点や用途もありますか?
追加された 著者 user893334,

It's valid. It's called Anonymous class. See here

匿名クラスを定義してインスタンス化するための構文の例をすでに見てきました。その構文をより正式に表現することができます:

 新しいクラス名([argument-list]){class-body}
 
     

または:

  new interface-name(){class-body}
 
10
追加された
+1 tnx素敵なリンク
追加された 著者 user893334,

このインタフェースを実装する anonymous 型/ classと呼ばれます。チュートリアル - ローカルおよび匿名の内部クラスを参照してください。

1
追加された

その宣言は、実際に ContentVisitor インターフェースを実装し、そのスコープのインスタンスを完全に有効にする新しい匿名クラスを作成します。

1
追加された

これは、インラインインターフェイスの実装です。ここでは、インターフェイスを実装する匿名クラスをコンパイラに生成させることを考えています。次に、インタフェースに定義されている各メソッドについて、(オプションで)インタフェースのメソッドの実装として使用される適切なシグネチャをメソッドに渡すことができます。

これは新しいOxygene構文であり、OxygeneプログラマがJavaプログラマと同じようにこれらのインタフェースベースのイベントを処理できるようにするために追加されました。

0
追加された

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

0
追加された

あなたは実際に、このインタフェースの実装を匿名で提供しました。これはかなり一般的であり、もちろん可能です。詳細については、こちらをご覧ください。

0
追加された

中括弧が開いている場所に注意してください - ContentVisitor とその場で必要なすべてのメソッドを実装する内部オブジェクト(匿名クラス)を宣言しています!

0
追加された