Kotlinのpropertiesを見ると、このコンセプトは多少私にとって不思議なことですが、プライベートproperty
がfield
(インスタンス変数)であることを正当なものにしていますか?プライベートの「プロパティ」は「フィールド」ですか?
答えて
あなたはを得ることができます(とが変更可能なもののためにを設定)値等の特性を考慮することができるが、彼らはカスタムやオーバーライド振る舞いを持つことができ、実際に格納されない場合があります。プロパティはフィールドではありません。
コトルでは、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
ことができますが、それは別の意味を持つことになります。
「Kotlinのクラスにはフィールドがない」(Properties and Fields - Kotlin Programming Language)。
さらに、「JavaのフィールドとしてKotlinプロパティを公開する必要がある場合は、@JvmField
注釈で注釈を付ける必要があります」(Calling Kotlin from Java - Kotlin Programming Language)。それはまだフィールドではありません。
Kotlinクラスにはフィールドがないので、常にプロパティをプロパティとして参照することをお勧めします。
Javaのプライベートプロパティは、特定の条件の下でプライベートフィールドです。注釈はフィールドを公開する*必要があります(プライベートよりも見やすくなります)。 "デフォルトゲッターとセッターを使ったプライベートプロパティへのアクセスが最適化され、関数呼び出しオーバーヘッドが導入されない" –
- 1. プライベート-setterプロパティ
- 2. NHibernateは:プロパティは、フィールド
- 3. Flexでプライベート静的フィールドをハックする方法は?
- 4. プライベート変数公開プロパティにバインドすることは可能ですか?
- 5. .NETで一定のプロパティ/フィールド
- 6. TypeScriptコールバック中にプライベートC#プロパティが.dataプロパティにない
- 7. 「プライベート」パブリックURLのベストプラクティスは何ですか?
- 8. C#のフィールドとプロパティ
- 9. JavaScript:フィールドまたはプロパティ
- 10. DTO。プロパティまたはフィールド?
- 11. プライベート内部クラスのコンストラクタもプライベートですか?
- 12. 私は抽象クラスでプライベート最終フィールドを持つことができます
- 13. Java Enumコンストラクタはプライベートですか?
- 14. プライベートAPNSサーバーですか?
- 15. 私自身のプロパティで "使用可能なフィールド"プロパティを作成するには?
- 16. フィールド 'InputMask'プロパティをプログラムで設定する
- 17. Androidで通知:特定のプロパティ/フィールドを変更しますか?
- 18. IntelliJリファクタリングのプロパティ(get/setter)をフィールドに追加できますか?
- 19. プライベート静的読み取り専用フィールドの変更
- 20. プライベート静的読み取り専用フィールドの大文字化
- 21. バックボーンモデルを定義する規約は何ですか?クラスのプロパティ/フィールド
- 22. デストラクタでプライベート変数をnullにするのは何ですか?
- 23. プライベートCでJavaの
- 24. SubSonic 3.0.0.3 |シンプルリポート| Formulaプロパティ/フィールド
- 25. 無料プライベートsvn誰ですか?
- 26. QMLはプロパティのプライベートのようなアクセス指定子をサポートしていますか?
- 27. JMSSerializer(単一のプロパティを扱う)で入力フィールドと出力フィールドをフォーマットする
- 28. これらのプライベートな静的メンバーはスレッドセーフですか?
- 29. は、Amazon EC2プライベートDNS
- 30. QVariant :: QVariant(Qtの:: GlobalColor)は、」プライベート
概念的なものとは別に、はい:プライベートプロパティはフィールドのように動作し、実際にフィールドにコンパイルされます。つまり、アクセサメソッドはありません。 –
@KirillRakhman、それはもちろんカスタムアクセッサーがない場合に限ります。 – hotkey