[Android]Kotlinの「@JvmStatic」アノテーションとは

このページには広告が含まれる場合があります。

 

Kotlinでは、どのクラスからでもインスタンスを経由せずにアクセスできるメソッド(クラスメソッド)を作る方法の1つに「companion object」というものがあります。

例えば、こんな感じでcompanion objectの中にnewInstanceメソッドを設定すると、

class KotlinFragment : Fragment() {
    
  ********

    companion object {
     //↓これ
        fun newInstance(param1: String, param2: String) = 
                KotlinFragment().apply {
                    arguments = Bundle().apply {
                        putString(ARG_PARAM1, param1)
                        putString(ARG_PARAM2, param2)
                    }
                }
    }
}

 

他のKotlinファイルから呼び指す際に、KotlinFragmentのインスタンスを経由せずに、こんな感じでアクセスすることが出来ます。

 

companion object内に作ったメソッドはJavaでいう「static」メソッドではない

まさに、これはJavaでいう「staticメソッド(クラスメソッド)」という感じになるはずなのですが、ところがどっこいしょ。

他のJavaファイルからは、上のような感じで呼び出すことができず、

 

Companionクラスを経由しないと呼び出すことができないのです。

 

 

なんでや?

Kotlinのcompanion object内のメンバ(プロパティ・メソッド)は、一見Javaのstaticのように見えますが、実行時にインスタンス化されるので、インターフェースの実装なども出来るという点で、「static」とは異なる。

ということらしいです(companion objectは実際のオブジェクトのシングルトンインスタンスだそうです)。

こんな感じで。

interface Factory<T> {
    fun create(): T
}

class MyClass {
    companion object : Factory<MyClass> { ← Factoryインターフェースを実装している
        override fun create(): MyClass = MyClass()
    }
}

Note that, even though the members of companion objects look like static members in other languages, at runtime those are still instance members of real objects, and can, for example, implement interfaces:

(companion object内のメンバ(プロパティ・メソッド)は、他のプログラミング言語(Java等)における『static(静的な)』メンバのように見えるが、Kotlinでは、実行時におけるこれらのメンバは実オブジェクトのインタンスメンバ(動的メンバ)であり、たとえばインターフェースを実装することもできる)

https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects

 

ほなどないしたらエエねん!?

「@JvmStatic」アノテーションをつけたらエエということらしいです。

However, on the JVM you can have members of companion objects generated as real static methods and fields, if you use the @JvmStatic annotation.

(しかしながら、JVM(Java Virtual Machine)では、companion objectのメンバを本当にstaticなフィールドやメソッド(メンバ)として生成することもでき、その際は@JvmStaticアノテーションをつければよい)

https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects

 

ですので、こうしてやると、

class KotlinFragment : Fragment() {
    
  ********

    companion object {
    @JvmStatic //←こいつ
        fun newInstance(param1: String, param2: String) = 
                KotlinFragment().apply {
                    arguments = Bundle().apply {
                        putString(ARG_PARAM1, param1)
                        putString(ARG_PARAM2, param2)
                    }
                }
    }
}

 

Javaファイルからでも、ちゃんとstaticメソッドとしてアクセスできるようになりました。

 

ということです。

詳しい解説は下の動画をご覧ください。それよりもっと詳しく知りたい場合はこれを読めばいいかもです。

 

こんな記事も読まれています

イチオシ

40代から感じるモヤモヤを解消できる 無料動画セミナー

あすコロ式・40代からの人生アップデート【新】戦略

アラフォーでキャリアを失ったバリバリ左脳人間・スピリチュアル耐性ゼロの元金融マンが、人生どん底から立ち上がる過程でたどり着いた「人生再構築メソッド」。40代・50代を過ぎて多くの人が感じる「このままでいいんかな?」「この先どうしたらいいかわからない」というモヤモヤを解消し、人生後半戦をアップデートさせる【新】戦略。

今すぐ無料で動画セミナー(80分)を見る ▶
GAMBO(願望) 願望実現・目標達成の
17秒 / 68秒ワーク
GAMBO(願望) 引き寄せ難民だったぼくの挫折経験から生まれた誰でもできる願望実現サポートアプリ。かの有名な17秒/68秒ワークを独自の視覚化メソッドで簡単実践。
App Store / Google Play 詳しく見る →
Meiso(瞑想) 鐘音と自然音で
5分からのマインドフルネス
Meiso(瞑想) 初心者でも“迷わず続けられる”ことにこだわった、完全無料の瞑想アプリ。画面のガイドに従うだけで呼吸のリズムが整い、最短5分から瞑想を実践できます。
App Store / Google Play 詳しく見る →
小学生からの英検®単語 A ふりがな・音声付き
英検単語1日5分トレーニング
小学生からの英検®単語 ありそうでなかった!ふりがな付き英検®単語トレーニングアプリ!1日たった5分!スキマ時間を活用して、英検®頻出単語を効率的に習得。お子様の一人学習にも安心設計。
App Store / Google Play 詳しく見る →
オボエルンジャー レトロゲームで
nバック脳トレ
オボエルンジャー 科学的脳力開発法「Nバック課題」をファミコン風8bitレトロゲームにアレンジした新感覚脳トレアプリ。記憶力・感情コントロール力・集中力の向上に。
App Store / Google Play 詳しく見る →
ゴイコイコイ 超高速フラッシュカードで
語彙習得
ゴイコイコイ 日常語1400語を視覚的に学べる、高速読み上げフラッシュカード式の語彙トレーニングアプリ。知育教室で行われるフラッシュカード学習を、家庭で“手軽に・安価に・正確に”再現。
App Store / Google Play 詳しく見る →

TOP