置き換えるために良い理由(パフォーマンス的に)あり:インスタンスvalは、オブジェクトvalよりもコストがかかりますか?
val SOME_CONST = "value"
companion object {
val SOME_CONST = "value"
}
@JvmStatic
注釈が結果を変える追加してい
置き換えるために良い理由(パフォーマンス的に)あり:インスタンスvalは、オブジェクトvalよりもコストがかかりますか?
val SOME_CONST = "value"
companion object {
val SOME_CONST = "value"
}
@JvmStatic
注釈が結果を変える追加してい
はい、に格納されているval
が効率的です。 Kotlin bytecode viewerを使用して、これらのオプションをコンパイルする方法を調べることができます。
コンパニオンオブジェクトval
は、実際にこのようにインスタンスのメモリフットプリントを増やす各インスタンスに格納されたインスタンスval
とは異なり、一度だけ保存されている(String
リテラル:ここ
コンパニオンオブジェクトval
を複数回連続してアクセスすると、CPUキャッシュの方が、val
を使用するよりもうまく機能します。locality of referenceが良いでしょう。 val
にアクセスするために異なるインスタンスを参照解除すると、CPUキャッシュミスが発生する可能性が高くなります。
ただし、val
が同じクラスのインスタンスメソッド内でのみ使用される場合、この方法はパフォーマンスにほとんど影響しません。この方法はおそらくthis
を逆参照する可能性があります。コンパニオンオブジェクト。
@JvmStatic
を追加すると、アクセスが少し速くなります。それがなければ、値にアクセスするには、静的なCompanion
リファレンスを取得し、getSOME_CONST()
を呼び出す必要があります。 @JvmStatic
では、静的メソッドgetSOME_CONST()
(スキップCompanion
)があります。 @JvmField
もあり、getterを呼び出しなくても直接アクセスできるパブリックフィールドを作成します。
しかし、JITコンパイラは最初の2つのケースのゲッターアクセスを最適化する可能性が高いため、アノテーションの効果はほとんど目立たないでしょう。
また、別にパフォーマンスから、インスタンスval
は、インスタンスごとに異なる場合があります値の意味を持っているので、companion object
は、より良い地球一定の値の場合に合わせているようです。
スタンドアロンのオブジェクトを定数に使用できますが、必ずしもコンパニオンではありません。 – voddan