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. JavaFX:FXMLフィールドをプライベートにできますか?
- 2. プライベート-setterプロパティ
- 3. SQLAlchemy、プライベート変数のフィールド
- 4. kotlinでは、プライマリコンストラクタのプロパティのセッタをプライベートにする方法は?
- 5. プロパティ 'currentUrlTree'はプライベートで、 'Router'クラス内でのみアクセス可能です
- 6. クラスメンバーはプライベートでプロパティは公開されているのはなぜですか?
- 7. 属性からプライベートconstフィールドにアクセスできるのはなぜですか?
- 8. テストからプライベートstructフィールドにアクセスできますか?
- 9. Kotlinのクラスのプロパティはプライベートでアクセスする必要がありますか?
- 10. Springの@Autowiredフィールドをプライベートに設定するのはよい習慣ですか?
- 11. Sender IDはプライベートですか?
- 12. CallInstコンストラクタはプライベートですか?
- 13. Flexでプライベート静的フィールドをハックする方法は?
- 14. java.lang.Integerがプライベート値フィールドを公開しないのはなぜですか?
- 15. NHibernateは:プロパティは、フィールド
- 16. エンクロージングクラスのプライベート列挙型と静的フィールド
- 17. プライベート変数公開プロパティにバインドすることは可能ですか?
- 18. 「プライベート」パブリックURLのベストプラクティスは何ですか?
- 19. Python - 「フィールドのプロパティを追加する」とは何ですか?
- 20. django形式のプロパティとmetaフィールドの違いは何ですか?
- 21. .NETで一定のプロパティ/フィールド
- 22. TypeScriptコールバック中にプライベートC#プロパティが.dataプロパティにない
- 23. プライベート関数でCodeIgniterの/ PHPのエラー未定義プロパティ
- 24. プライベート内部クラスのコンストラクタもプライベートですか?
- 25. キーワード「プライベート」がクラスレベルでプライベートであるとはどういう意味ですか?
- 26. 私は抽象クラスでプライベート最終フィールドを持つことができます
- 27. tinyxml2 XMLElementコンストラクタはプライベートですか?
- 28. Java Enumコンストラクタはプライベートですか?
- 29. C#のフィールドとプロパティ
- 30. mongooseの `population`フィールドのプロパティからモデルのプロパティを設定するには?
概念的なものとは別に、はい:プライベートプロパティはフィールドのように動作し、実際にフィールドにコンパイルされます。つまり、アクセサメソッドはありません。 –
@KirillRakhman、それはもちろんカスタムアクセッサーがない場合に限ります。 – hotkey