コンパニオンオブジェクトで@JvmStaticを使う理由とタイミングは?
疑問点
JvmStaticを使うか使わないかの違いと、どちらを使うべきかのタイミングを理解しようとしています。
KotlinとJavaで、こんなことができるんですね。
TestKotlin.kt
class TestKotlin {
companion object {
val someString = "hello world"
}
}
これをJavaで呼び出すと、次のようになります。
TestJava.java
public class TestJava {
String kotlinStaticString = TestKotlin.Companion.getSomeString();
}
が、このオプション2があります。
TestKotlin.kt
v2
class TestKotlin {
companion object {
@JvmStatic // <-- notice the @JvmStatic annotation
val someString = "hello world"
}
}
そして、このようにJavaから呼び出します。
TestJava.java
v2
public class TestJava {
String kotlinStaticString = TestKotlin.getSomeString();
}
そこで質問なのですが
- これらの 2 つのケースは、動作やメモリ割り当ての面で何か違いがありますか?
- どちらを使うべきか、好みがありますか?
- どちらも Java static のように擬似的な静的シングルトン オブジェクトを作成しますか?
ありがとうございます!
どのように解決するのですか?
の動作は
@JvmStatic
アノテーションの動作の詳細については
のドキュメントを参照してください。
. ドキュメントを読む場合、重要な情報はすべて与えられており、ドキュメントに記載されていない動作の違いは存在しないと考えるべきです。
この場合、ドキュメントに書かれている
このアノテーションを使用すると、コンパイラはオブジェクトを包含するクラスのスタティックメソッドと、オブジェクト自体のインスタンスメソッドの両方を生成します。
言い換えれば、このアノテーションの効果は、コンパイラに以下を指示することです。 追加のメソッドを生成する .
ドキュメントには、動作やメモリ割り当てに違いがあることが書かれていますか?ありません。したがって、ないと考えてよいでしょう。
どちらを使うべきかの優先順位はありますか?通常、APIは一箇所で宣言し、複数箇所から利用するものです。もしJavaからメソッドを呼び出すのであれば、そのメソッドを宣言する際に
@JvmStatic
を追加する必要があるからです。
@JvmStatic
アノテーションを一か所に追加することで、複数の
.Companion
を省くことができます。
どちらもJava staticのように擬似静的シングルトン・オブジェクトを作成するのですか?Java static は "擬似静的シングルトン オブジェクトを作成しないので、この質問は意味を持ちません。Javaクラスでstaticメソッドを宣言し、そのメソッドを呼び出すと、オブジェクトは生成されません。
関連
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
Javaでよくある構文エラー
-
FindBugの使用概要
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] java.net.URLConnectionを使用してHTTPリクエストを発生させ処理する方法
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] Kotlin クラス内のオブジェクトとコンパニオンオブジェクトの違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NullPointerException - java.lang.
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
-bash: java: コマンドが見つからない 解決方法
-
java.sql.SQLException: 結果セットの開始前
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.