2016-03-25 7 views
4

Kotlinのpropertiesを見ると、このコンセプトは多少私にとって不思議なことですが、プライベートpropertyfield(インスタンス変数)であることを正当なものにしていますか?プライベートの「プロパティ」は「フィールド」ですか?

+1

概念的なものとは別に、はい:プライベートプロパティはフィールドのように動作し、実際にフィールドにコンパイルされます。つまり、アクセサメソッドはありません。 –

+1

@KirillRakhman、それはもちろんカスタムアクセッサーがない場合に限ります。 – hotkey

答えて

9

あなたはを得ることができます(とが変更可能なもののためにを設定)値等の特性を考慮することができるが、彼らはカスタムやオーバーライド振る舞いを持つことができ、実際に格納されない場合があります。プロパティはフィールドではありません。

コトルでは、privateであるかどうかにかかわらず、を持つことができます。backing fieldである必要はありません。

  • バッキングフィールドを持つプロパティ:

    ここ
    var counter = 0 
    

    0はバッキングフィールドに入れ、そしてフィールドなどのプロパティふるまうされています。それから値を取得することに格納されている値を返します。フィールドに値を設定すると、値がバッキングフィールドに格納されます。しかし、それはフィールドではありません。 Javaの場合、それはまだゲッターとセッターのペアになります。

    カスタムアクセスがないプライベートプロパティare optimizedファンクションコールのオーバーヘッドを避けるためにフィールドにコンパイルされますが、実装の詳細です。カスタムアクセサを追加すると、プロパティにアクセスするバイトコードも変更されます。ここで

    var counter = 0 
        get() = field + 1 
        set(value) { if (value >= 0) field = value } 
    

    再びプロパティは、バッキングフィールドを持っていますが、その振る舞いが異なる場合、カスタムはget()set(...)counter = somethingまたはval x = counterのような文で実行されますアクセサ。これは、クラスの内部と外部の両方からプロパティにアクセスする場合に当てはまり、privateのプロパティはここでは変わりません。

    バッキングフィールドは、アクセサリコードfieldによって直接アクセスすることができますが、他のコードには公開されません。別の場所からバッキング値にアクセスする場合は、別のbacking propertyを定義する必要があります。プロパティに@JvmFieldアノテーションを追加することで、バッキングフィールドをJavaコードに公開できます(これによりKotlinからアクセスできなくなります)。バッキングフィールドのない

  • プロパティ

    宿泊施設には初期化子を持っていないし、少なくともget()を持っている場合、それはバッキングフィールドを持つプロパティです:

    val time: Long get() = System.currentTimeMillis() 
    

    ませバッキングフィールドは、それのために生成されません上記のように、別のプロパティをバッキングプロパティとして使用することもできます。無バッキングフィールドを持つ


プロパティもかなり遠く分野からであるextension properties、ことができます。

val String.isCapitalized: Boolean get() = length > 0 && this[0].isUpperCase()  

が、これらもprivateことができますが、それは別の意味を持つことになります。

1

「Kotlinのクラスにはフィールドがない」(Properties and Fields - Kotlin Programming Language)。

さらに、「JavaのフィールドとしてKotlinプロパティを公開する必要がある場合は、@JvmField注釈で注釈を付ける必要があります」(Calling Kotlin from Java - Kotlin Programming Language)。それはまだフィールドではありません。

Kotlinクラスにはフィールドがないので、常にプロパティをプロパティとして参照することをお勧めします。

+0

Javaのプライベートプロパティは、特定の条件の下でプライベートフィールドです。注釈はフィールドを公開する*必要があります(プライベートよりも見やすくなります)。 "デフォルトゲッターとセッターを使ったプライベートプロパティへのアクセスが最適化され、関数呼び出しオーバーヘッドが導入されない" –

関連する問題