解析Kotlinに伴うオブジェクト

3572 ワード

最近Kotlinを学び始めて、kotlinをよく見て、多くの文法の砂糖があって、まずandroidプラットフォームで足元に立って、それからゆっくりと他のプラットフォームに伸びます

引用する
最近Kotlinを学んで、学習の過程の中で、ますます強烈な感じがして、Kotlinの精髄を掌握するために、必ず利用しなければならないJavaの言語の特性は理解を深めて、Kotlinの多くの文法の糖の特性を学ぶことに対して大いに役に立ちます!
この文章のポイントは次のとおりです.
  • 対象を伴う単純栗
  • classファイルをコンパイルし、関数/属性拡張との違い
  • を理解する.
    公式の説明を参照:
    Kotlin, similar to C# and Gosu, provides the ability to extend a class with new functionality without having to inherit from the class or use any type of design pattern such as Decorator. This is done via special declarations called extensions. Kotlin supports extension functions and extension properties.
    Simplyとは、Kotlinが継承や装飾モードを必要とせず、特定のクラスに新しい関数や属性を拡張し、そのまま使用できることです.

    1.簡単な栗を挙げる.
    fun main(args: Array) {
        Extension.action()
        println(Extension.data)
    }
    
    class Extension {
    
        var variety: String = "origin "
    
        companion object {
            fun action() {
                println("action")
            }
    
            val data = "123"
        }
    
    }
    伴随オブジェクトの一般的な定義は以上のように、ターゲットExtensionクラスで伴随オブジェクトを定義し、伴随オブジェクトに関数actionと属性dataを定義してから、Extension.action()とExtension.dataで使用することができ、kotlinでは便利ですが、Javaでは多くの静的メソッドと属性を定義して同じ機能を実現します
    このような書き方を考えると、Kotlinの伴随オブジェクトがどのように実現されているのか、Javaの静的関数や静的属性と似ているのか、呼び出し方がそこにあるのか、そう思わないのは難しいかもしれません.
    2.公式の栗を食べ始める
    2.1コード個
    拡張関数と拡張属性を比較するために、コードに拡張関数と属性のコードを加えて、比較してみましょう.
    コードは次のとおりです.
    fun main(args: Array) {
        Extension.action()//Extension       
        println(Extension.data)//Extension       
    
        Extension().fly()//Extension     
    
        Extension.run()//Extension          
    }
    
    class Extension {
        var variety: String = "origin "
    
        companion object {
            fun action() {
                println("action")
            }
    
            val data = "123"
        }
    
    }
    
    fun Extension.Companion.run() {
        println("run with $data")
    }
    
    fun Extension.fly() {
        println("fly with $variety")
    }
    呼び出し方法の違いに注意してください.特に3行目と4行目です.
    具体的な出力は実行しなくてもわかりますが、内部がどのように実現されているのか、特にclassにコンパイルされた後に注目することが重要です.
    2.2.classにコンパイル
    デスクトップの上でvimの1つのExtension.ktファイル、上述のコードを書きます;
    次にコマンドを実行します
    .classファイルを入手した後、jd-juiでプローブを開きます.
    実行できない場合は、次のコマンドを実行して環境を構成し、最初のステップを再試行してください(PS:何度ダウンロードしても失敗する可能性があります.理由は分かります.もし本当にだめなら、copy studioの下のフォルダを自分で検索してください.私はこの方法を試したことがありませんから.)
    $ sudo port install kotlin
    2.3伴随対象実現の理解
    jd-juiを使用して開くと、まずエントリ、すなわちmain関数のコンパイル後のコードを見てみましょう.
    Extension.classを見てみましょう
    元のKotlinコードとコンパイルされたバイトコードの違いが見られ、Javaで理解するのは簡単です
  • Extensionの付随オブジェクトの関数と属性は、コンパイル後に静的内部クラスを作成し、デフォルトで静的属性を生成し、最終コンパイル後にこの静的属性完了関数と付随オブジェクトの関数と属性呼び出し
  • を直接参照する.
  • Extensionの拡張属性(拡張関数と同じ原理)は本質的に言語レベルのデザイナモードで修飾された関数(第1の図の方法を参照)
  • である.
  • Extensionの伴随オブジェクトの拡張関数形式とExtensionの拡張関数(Extension.Complionに惑わされない==)
  • 拡張関数を比較すると、伴随オブジェクトは静的内部クラス(これはなぜKotlin伴随オブジェクト内で外部クラスにアクセスできないメンバー)にコンパイルされ、拡張関数/属性は装飾器モードでパッケージされ、両者は完全に異なることが分かった.

    締めくくり
    本文の過程から私たちは理解した.
  • に伴うオブジェクトの一般的な実装形態
  • .
  • オブジェクトに伴う言語実装メカニズム
  • に伴うオブジェクトと拡張関数/属性の違い
  • 注記:
    Kotlinの中国語のドキュメントはここを突くことができます
    公式にはkotlinオンラインプログラミングもサポートされています