1. ホーム
  2. java

コンパニオンオブジェクトで@JvmStaticを使う理由とタイミングは?

2023-07-20 17:59:27

疑問点

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メソッドを宣言し、そのメソッドを呼び出すと、オブジェクトは生成されません。