[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のインスタンスを経由せずに、こんな感じでアクセスすることが出来ます。

blank

 

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

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

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

blank

 

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

blank

 

 

なんでや?

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メソッドとしてアクセスできるようになりました。

blank

 

ということです。

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

 

(注)以下のフォームより当社公式メールマガジンにご登録頂くことで
約6時間のFlutter動画講座が無料で受講できます!

(メールマガジンは登録無料・いつでも解除可)

[体験版]
ゼロからのFlutter
(Flutter初級編) 

 

【体験版講座に含まれるもの】
・約70本・約6時間の動画テキスト
・1つの課題アプリのソースコード
・Flutterアプリを作るための「環境構築ライブサポート(Google Meet)」
(「体験版」は全30時間超の「製品版」の約1/6を抜粋した講座です。「製品版」の詳細はこちらから)

 

【当社公式メルマガご登録6大特典】
blank

\約6時間動画講座を無料プレゼント!/
今すぐ無料体験版に申し込む ▶
無料メルマガ登録で講座割引クーポンなど6大特典ゲット!

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

今すぐプレゼントを受け取る(約6時間のFlutter初級編体験版動画講座を無料でプレゼント)
blank

はじめての方へ

blank
みんプロ式プログラミング講座体系・ラインナップ
みんプロ式プログラミング講座受講の流れ(割引特典利用方法)
サイトマップ(みんプロHPコンテンツ一覧)
運営会社概要

みんプロ作成アプリ

blank
blank
blank
blank
blank

みんプロ式動画講座(コア・Flutter)

ゼロからのFlutter(初級編)-はじめてのプログラミングからアプリリリースまで-
Flutter中級編1-Web通信・設計・状態管理・DIの基礎-
Flutter中級編2-Firebase/地図・カメラ連携等の基礎-
Flutter中級編3-広告/アプリ内課金等の基礎-
Flutter中級編4-Webアプリとレスポンシブデザインの基礎-

みんプロ式動画講座(サテライト)

Flutter/Dartトラブルシューティング・小ネタ集(コア初級編受講で無料プレゼント)
ゼロからのGit・GitHub(コマンドラインツールを極力使わないバージョン管理入門)
Flutter/Dartにおける設計・状態管理・DIの解説集
Dart逆引き大辞典
Flutterにおけるテストの基礎
blank
blank

今すぐプレゼントを受け取る(約6時間のFlutter初級編体験版動画講座を無料でプレゼント)
TOP