Kotlinの中でJavaまたはC葃のような静的な方法をどうやって実現するかを詳細に説明する。

3064 ワード

このような記事はネットで検索できます。公式推薦は包級関数です。これらはいい選択ですが、完璧ではありません。状況によってはもっといい選択があります。いくつかの方法をまとめました。それぞれ、バッグレベル関数、バックグラウンドオブジェクト、拡張関数、オブジェクト宣言です。これはみんなが状況によって選択する必要があります。
一、パッケージレベル関数
KotlinとJavaとC铉は違います。カバンの中で直接関数を宣言することができます。作り方はクラスの中と同じです。ここでは多く話しません。本当にいい選択です。関数に適用します。内部のクラスを含まずにデータを共有する方法が必要ではありません。
二、連れの人
意味的には、随伴関数はJavaにおける静的アプローチに最も近いので、随伴オブジェクトを用いてJavaにおける静的なクラスのすべての内容を完全に実現することができる。しかし、Javaでは静的な方法を使う時には、仕方なく選択します。Kotlinでは、随伴対象は私たちの選択の一つです。紹介します。
Javaを使う時、Java類の静的変数と方法はいつ初期化されましたか?静的方法の最初の呼び出し時ですか?それとも対応するJavaクラスのローディング時ですか?答えはJavaクラスでロードされたときです。すなわち、Javaクラスのインスタンス変数および方法を呼び出した後でも、静的変数および方法を使用しなくても、静的変数は初期化されました。このような現象は連れを使って説明するのが適切ですか?
Kotlinでは、1つのクラスには2つの種類の東があり、1つはJavaクラスのインスタンス変数および方法であり、もう1つはJavaクラスの静的変数および方法であると考えられている。Kotlinさんは静的な例と方法を一つのバックグラウンドにまとめて包装します。このようです。次の例を示します。

fun main(args: Array<String>) {
 Books.getBestSellers()
}
class Books(var name: String, val page: Int) {
  fun getWordCount()=page*100
  companion object ComBooks{
    var bestSellers=arrayOf("Harry Potter\r\t","Lord of the Rings\r\t")
    fun getBestSellers() {
      bestSellers.forEach{v->println(v)}
    }
  }
}

伴生類はcompanionで声明したもので、彼は随伴生の対象となるクラスにロードされ、伴生対象は初期化され、Java静的なメンバーと同じである。匿名であってもよく、または彼を含むクラス名と同じであってもよい。呼び出しは2つあります。Books.ComBooks.getBestSellsers()?またはBooks.getBestSellsers()?。です。
三、拡張機能
Javaでは、私たちはよくUtils類を書きます。これらの種類はいずれかのオブジェクトに対して機能を自分のプログラムと一致させる操作をします。その中の方法は静的な方法で多く、例えば:

public class Utils {

  public static boolean isEmpty(String string){
    return string != null && string.length() == 0;
  }

  public static boolean isWeakEmpty(String string){
    return isEmpty(string) && string.trim().length() == 0;
  }
}
もちろん上記の2つの方法でこれらの静的方法を実現できますが、より良い方法があります。

fun String.isEmpty() = this != null && this.length == 0;

fun String.isWeakEmpty()= this.isEmpty() && this.trim().length == 0
上の2行のコードはStringという種類に2つの関数を拡張しました。この2つの関数は元の関数のように呼び出されて、コードがとても美しいです。実は拡張関数はString類内部のものを修正していません。Stringに二つの静的関数を加えただけです。しかし、JavaのUtils類に比べて、可読性は非常に高くなりました。
四、対象声明
上記のUtils類を引き続き考慮して、このクラスのすべての方法(時には変数もあります)は静的で、この方法はまったく実用化する必要がありません。Javaではよくこの種類を静的な種類として宣言します。Kotlinではこのような状況に対して良い対策がありますか?連れよりいいプランがありますか?もちろんあります。対象声明は一つです。
オブジェクト宣言は非常によく理解できます。オブジェクトをobjectのキーワードで宣言しました。オブジェクトの中に変数を使ってもいいし、方法があります。

object AppInfo{
  var AppName = "Kotlin Message"
  var AppAuthor = "Riley Ge"
  fun toSimpleString() {
    println("AppName:$AppName,AppAuthor:$AppAuthor") 
  }
}
Kotlinのオブジェクトが本当に強いことを発見しました。ちょっと注意してください。AppInfoは初めて訪問された時に初期化が遅れています。つまり、対象声明の時にAppInfoは初期化されていません。
五、まとめ
こんなに多くの方法を話しましたが、今は誰も心配していません。そしてKotlinもみんなにもっと多くの選択を与えました。みんなは自分の実際の状況によって適切な方法を選択して、自分のコードを効率的で優美にすることができます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。