コード量を3倍に減らします!kotlinを使ってAndroid(四)kotlin beanの背後にある秘密を開発する

5137 ワード

前回は5倍に短縮したjava beanを紹介しましたが、見ている間に疑問がありましたか?
本文はブロガーのプライベートブログwingの地方酒場から同期します
2つのコードの対比を振り返ってみましょう
public class User {
    private String name;
    private String id;

    public User(String name, String id) {
    this.name = name;
    this.id = id;
}


public String getName() {
    return name;
}


public void setName(String name) {
    this.name = name;
}


public String getId() {
    return id;
}


public void setId(String id) {
    this.id = id;
}



data class User(var name: String, var id: String)


コードが少なくなっていることがわかりますが、違います.なぜですか.Java beanでは通常、メンバー変数をプライベートに設定し、外部に公開せず、getter、setterを提供して外部アクセスを提供しますが、kotlin beanにはありません.そこでdata classを拡張しようとし、発見しました.privateを設定するとgetter、setterが提供されません.
もし疑問があれば、続けて見てください.唯一真相を見抜くのは外見が大人に見えるが、脳が萎縮して子供のIQしかない名探偵wing!
手がかり
みんな知っています.のkotlinはjvmで実行される言語なので、当然ですが、彼はjvm仮想マシンの仕様に従っています.つまり、生成されたのはclassファイルなので、classをjava言語に逆コンパイルすることができます.彼はjavaと比較します.私たちが望んでいる答えを明確に得ることができます.
まずktファイルを作成し、次のように入力します.
class User(){
    public var name:String = "hah"
}

明らかにこれはUserクラスで、Stringメンバーnameを持っています.コマンドラインでkot lincコンパイルを使用します.
kotlinc user.kt

classファイルを取得し、classをJD_で使用します.GUIを開くと、次のコードが得られます.
public final class User {


  @NotNull
  private String name = "hah";


  @NotNull
  public final String getName() { return this.name; } 
  public final void setName(@NotNull String <set-?>) { Intrinsics.checkParameterIsNotNull(<set-?>, "<set-?>"); this.name = <set-?>;
  }
}

ノ、真相は明らかになって、事実はkotlinの中で説明して、privateを必要としないでそしてgetterとsetterを通じて、以上の結論からkotlinの中のpublicはjavaの中のprivate+getter+setterに等価です!!!
ふんふん?これであなたの疑念を解決しましたか?ついでに、伴生対象がどのように実現されているかを見ることができます.
class User(){
public var name:String = "hah"




companion object{
   fun getName():String{
        return "name"
}
}
}


逆コンパイル後、user.とclass同級ディレクトリの下には複数のUser$Companionがあります.classのファイル、彼はuserの伴生オブジェクトで、対応するjavaコードを以下のように表示します.
public final class User$Companion {
  @NotNull
  public final String getName()
  {
    return "name";
  }
}


実際に伴生オブジェクトがstaticで実現されていないのを見ると、staticとは違いますが、objectである以上classではないはずなのか、あるいはこのclassは一例しかないので、もう一つの奇抜な単利モデルと言えるでしょう.要するに、このオブジェクトはuser生に従い、user死に従い、彼女はインスタンスを持っていて、方法を提供しています.今のところ私の理解はこのようにして、もし間違いがあれば、指摘を歓迎します~~
本文はこれで终わります(文字が短すぎるのが嫌ですか?焦らないで、先に実践してください...シリーズの文章は、穴を掘った以上、もっと引きずらないでしょう.)
Android開発者ならwingのバー:425983695で開発経験を共有することもできますよ
Kotlinを使用して開発された完全なプロジェクトアドレス