ありません static
Kotlinにキーワード。
static
KotlinでJavaメソッドを表す最良の方法は何ですか?
ありません static
Kotlinにキーワード。
static
KotlinでJavaメソッドを表す最良の方法は何ですか?
回答:
関数を「コンパニオンオブジェクト」に配置します。
したがって、次のようなJavaコード:
class Foo {
public static int a() { return 1; }
}
となります
class Foo {
companion object {
fun a() : Int = 1
}
}
次に、Kotlinコード内から次のように使用できます。
Foo.a();
しかし、Javaコード内から、次のように呼び出す必要があります。
Foo.Companion.a();
(これはKotlin内でも機能します。)
Companion
ビットを指定する必要がない場合は、@JvmStatic
注釈を追加するか、コンパニオンクラスに名前を付けることができます。
ドキュメントから:
コンパニオンオブジェクト
クラス内のオブジェクト宣言は、コンパニオンキーワードでマークできます。
class MyClass { companion object Factory { fun create(): MyClass = MyClass() } }
コンパニオンオブジェクトのメンバーは、クラス名を修飾子として使用するだけで呼び出すことができます。
val instance = MyClass.create()
...
ただし、JVMでは、
@JvmStatic
アノテーションを使用すると、実際の静的メソッドおよびフィールドとして生成されるコンパニオンオブジェクトのメンバーを持つことができます。詳細については、Javaの相互運用性のセクションを参照してください。
@JvmStatic
注釈の追加は次のようになります
class Foo {
companion object {
@JvmStatic
fun a() : Int = 1;
}
}
そして、それは実際のJava静的関数として存在し、JavaとKotlinの両方からアクセスできますFoo.a()
。
Companion
名前が嫌いな場合は、コンパニオンオブジェクトの名前を次のように明示的に指定することもできます。
class Foo {
companion object Blah {
fun a() : Int = 1;
}
}
同じ方法でKotlinから呼び出すことができますが、JavaのようにFoo.Blah.a()
(これはKotlinでも動作します)。
fun a(): Int { return 1 }
それは同じか、それとも同じですfun a(): Int = 1
fun a() = 1
。
Factory
はコンパニオンオブジェクトの名前ですが、何に使用できますか?わかりませんが、興味があったので、専用の質問を作成しました:stackoverflow.com/q/45853459/221955。
ドキュメントでは、静的関数のほとんどのニーズをパッケージレベルの関数で解決することをお勧めしています。これらは、ソースコードファイルのクラス外で宣言されているだけです。ファイルのパッケージは、packageキーワードを使用してファイルの先頭に指定できます。
宣言
package foo
fun bar() = {}
使用法
import foo.bar
あるいは
import foo.*
これで関数を呼び出すことができます:
bar()
または、importキーワードを使用しない場合:
foo.bar()
パッケージを指定しない場合、関数はルートからアクセスできます。
Javaの経験しかない場合、これは少し奇妙に思えるかもしれません。その理由は、kotlinが厳密にオブジェクト指向の言語ではないためです。クラス外のメソッドをサポートしていると言えます。
編集:彼らはドキュメントを編集して、パッケージレベルの関数の推奨に関する文が含まれないようにしました。これは上記で参照されたオリジナルです。
class FooPackage
すべてのトップレベルのプロパティと関数でを作成し、すべての参照をそれらに適切にルーティングします。jetbrainsからの詳細情報。
bar()
ファイル名に関係なく、名前を付けることができることを明確にしたかったBarUtils.kt
ので、テキストでそれをインポートするとしますimport <package name>.bar
A.古いJavaの方法:
companion object
静的メソッド/変数を囲むようにaを宣言します
class Foo{
companion object {
fun foo() = println("Foo")
val bar ="bar"
}
}
使用する :
Foo.foo() // Outputs Foo
println(Foo.bar) // Outputs bar
B.新しいKotlinの方法
ファイルを直接宣言したクラスせずに.kt
ファイル。
fun foo() = println("Foo")
val bar ="bar"
名前methods/variables
とともにを使用します。(インポート後)
使用する :
foo() // Outputs Foo
println(bar) // Outputs bar
INSTANCE
、このように、キーワードを:Foo.INSTANCE.sayFoo()
static CLASS
だけでなく、このソリューションが必要な場合に推奨される方法だと思いますstatic methdos
。コンパニオンオブジェクトを使用すると、親クラスをインスタンス化できるためです。
val
静的ではありませんstatic final
。Java と同等です
オブジェクトを使用してval / var / methodを表し、静的にします。シングルトンクラスの代わりにオブジェクトを使用することもできます。クラス内で静的にしたい場合は、コンパニオンを使用できます
object Abc{
fun sum(a: Int, b: Int): Int = a + b
}
Javaから呼び出す必要がある場合:
int z = Abc.INSTANCE.sum(x,y);
Kotlinでは、INSTANCEを無視します。
object objectName {
fun funName() {
}
}
kotlinには静的キーワードがないため、静的メソッドのコンパニオンオブジェクトを渡す必要があります-コンパニオンオブジェクトのメンバーは、クラス名を修飾子として使用するだけで呼び出すことができます。
package xxx
class ClassName {
companion object {
fun helloWord(str: String): String {
return stringValue
}
}
}
Kotlinでstaticを適用する方法は2つあります
まず、クラスの下にコンパニオンオブジェクトを作成します
例:
class Test{
companion object{
fun isCheck(a:Int):Boolean{
if(a==0) true else false
}
}
}
この関数は次のように呼び出すことができます
Test.Companion.isCheck(2)
もう1つの方法は、オブジェクトクラスを作成することです。
object Test{
fun isCheck(a:Int):Boolean{
if(a==0) true else false
}
}
ハッピーコーディング!
Test.Companion.isCheck(2)
)IDEショーの警告と言いますCompanion reference is redundant
。それはに縮小することができTest.isCheck(2)
、縮小された形式はJavaの同等物により近くなります。
上記の回答に何か追加したいと思います。
はい、ソースコードファイル(クラス外)で関数を定義できます。ただし、Kotlin Extensionsを利用して静的関数を追加できるため、Companion Objectを使用してクラス内に静的関数を定義することをお勧めします。
class MyClass {
companion object {
//define static functions here
}
}
//Adding new static function
fun MyClass.Companion.newStaticFunction() {
// ...
}
また、コンパニオンオブジェクト内の任意の関数を呼び出すので、上記で定義した関数を呼び出すことができます。
これは2年以上前で、すばらしい答えがたくさんありますが、「静的な」Kotlinフィールドを取得する他の方法がいくつか見受けられます。Kotlin-Java static
相互運用のガイドの例を次に示します。
シナリオ1:Kotlin for Javaで静的メソッドを作成する
コトリン
@file:JvmName("KotlinClass") //This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Java package com.frybits class KotlinClass { companion object { //This annotation tells Java classes to treat this method as if it was a static to [KotlinClass] @JvmStatic fun foo(): Int = 1 //Without it, you would have to use [KotlinClass.Companion.bar()] to use this method. fun bar(): Int = 2 } }
ジャワ
package com.frybits; class JavaClass { void someFunction() { println(KotlinClass.foo()); //Prints "1" println(KotlinClass.Companion.bar()); //Prints "2". This is the only way to use [bar()] in Java. println(KotlinClass.Companion.foo()); //To show that [Companion] is still the holder of the function [foo()] } //Because I'm way to lazy to keep typing [System.out], but I still want this to be compilable. void println(Object o) { System.out.println(o); } }
マイケルアンダーソンの回答はこれよりも詳細であり、このシナリオでは必ず参照する必要があります。
この次のシナリオでは、Kotlinで静的フィールドを作成するためKotlinClass.foo()
、静的関数が不要な場合にJavaが呼び出しを続ける必要がないようにします。
シナリオ2:Kotlin for Javaで静的変数を作成する
コトリン
@file:JvmName("KotlinClass") //This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Java package com.frybits class KotlinClass { companion object { //This annotation tells Kotlin to not generate the getter/setter functions in Java. Instead, this variable should be accessed directly //Also, this is similar to [@JvmStatic], in which it tells Java to treat this as a static variable to [KotlinClass]. @JvmField var foo: Int = 1 //If you want something akin to [final static], and the value is a primitive or a String, you can use the keyword [const] instead //No annotation is needed to make this a field of [KotlinClass]. If the declaration is a non-primitive/non-String, use @JvmField instead const val dog: Int = 1 //This will be treated as a member of the [Companion] object only. It generates the getter/setters for it. var bar: Int = 2 //We can still use [@JvmStatic] for 'var' variables, but it generates getter/setters as functions of KotlinClass //If we use 'val' instead, it only generates a getter function @JvmStatic var cat: Int = 9 } }
ジャワ
package com.frybits; class JavaClass { void someFunction() { //Example using @JvmField println(KotlinClass.foo); //Prints "1" KotlinClass.foo = 3; //Example using 'const val' println(KotlinClass.dog); //Prints "1". Notice the lack of a getter function //Example of not using either @JvmField, @JvmStatic, or 'const val' println(KotlinClass.Companion.getBar()); //Prints "2" KotlinClass.Companion.setBar(3); //The setter for [bar] //Example of using @JvmStatic instead of @JvmField println(KotlinClass.getCat()); KotlinClass.setCat(0); } void println(Object o) { System.out.println(o); } }
Kotlinの優れた機能の1つは、トップレベルの関数と変数を作成できることです。これは、定数フィールドと関数の「クラスレス」リストを作成するのに最適です。これはstatic
、Javaで関数/フィールドとして使用できます。
シナリオ3:JavaからKotlinの最上位フィールドおよび関数にアクセスする
コトリン
//In this example, the file name is "KSample.kt". If this annotation wasn't provided, all functions and fields would have to accessed //using the name [KSampleKt.foo()] to utilize them in Java. Make life easier for yourself, and name this something more simple @file:JvmName("KotlinUtils") package com.frybits //This can be called from Java as [KotlinUtils.TAG]. This is a final static variable const val TAG = "You're it!" //Since this is a top level variable and not part of a companion object, there's no need to annotate this as "static" to access in Java. //However, this can only be utilized using getter/setter functions var foo = 1 //This lets us use direct access now @JvmField var bar = 2 //Since this is calculated at runtime, it can't be a constant, but it is still a final static variable. Can't use "const" here. val GENERATED_VAL:Long = "123".toLong() //Again, no need for @JvmStatic, since this is not part of a companion object fun doSomethingAwesome() { println("Everything is awesome!") }
ジャワ
package com.frybits; class JavaClass { void someFunction() { println(KotlinUtils.TAG); //Example of printing [TAG] //Example of not using @JvmField. println(KotlinUtils.getFoo()); //Prints "1" KotlinUtils.setFoo(3); //Example using @JvmField println(KotlinUtils.bar); //Prints "2". Notice the lack of a getter function KotlinUtils.bar = 3; //Since this is a top level variable, no need for annotations to use this //But it looks awkward without the @JvmField println(KotlinUtils.getGENERATED_VAL()); //This is how accessing a top level function looks like KotlinUtils.doSomethingAwesome(); } void println(Object o) { System.out.println(o); } }
「静的」フィールドとしてJavaで使用できるもう1つの注目すべき点は、Kotlin object
クラスです。これらは、最初の使用時に遅延してインスタンス化されるゼロパラメーターのシングルトンクラスです。これらの詳細については、https://kotlinlang.org/docs/reference/object-declarations.html#object-declarationsをご覧ください。
ただし、シングルトンにアクセスするために、特別なINSTANCE
オブジェクトが作成されます。これは、そのまま処理するのと同じくらい面倒Companion
です。アノテーションを使用static
してJava でクリーンな感じを与える方法は次のとおりです。
シナリオ4:
object
クラスの使用コトリン
@file:JvmName("KotlinClass") //This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Java package com.frybits object KotlinClass { //No need for the 'class' keyword here. //Direct access to this variable const val foo: Int = 1 //Tells Java this can be accessed directly from [KotlinClass] @JvmStatic var cat: Int = 9 //Just a function that returns the class name @JvmStatic fun getCustomClassName(): String = this::class.java.simpleName + "boo!" //Getter/Setter access to this variable, but isn't accessible directly from [KotlinClass] var bar: Int = 2 fun someOtherFunction() = "What is 'INSTANCE'?" }
ジャワ
package com.frybits; class JavaClass { void someFunction() { println(KotlinClass.foo); //Direct read of [foo] in [KotlinClass] singleton println(KotlinClass.getCat()); //Getter of [cat] KotlinClass.setCat(0); //Setter of [cat] println(KotlinClass.getCustomClassName()); //Example of using a function of this 'object' class println(KotlinClass.INSTANCE.getBar()); //This is what the singleton would look like without using annotations KotlinClass.INSTANCE.setBar(23); println(KotlinClass.INSTANCE.someOtherFunction()); //Accessing a function in the object class without using annotations } void println(Object o) { System.out.println(o); } }
短くするには、「コンパニオンオブジェクト」を使用して、次のようにKotlin静的世界に入ることができます。
companion object {
const val TAG = "tHomeFragment"
fun newInstance() = HomeFragment()
}
また、定数フィールドを作成するには、コードのように「const val」を使用します。ただし、静的クラスはMockito!を使用した単体テストを困難にしているため、避けてください。
java静的メソッドを同等のkotlinに正確に変換すると、次のようになります。たとえば、ここでは、utilクラスに、javaとkotlinの両方で同等の静的メソッドが1つあります。@JvmStaticの使用は重要です。
Javaコード:
class Util{
public static String capitalize(String text){
return text.toUpperCase();}
}
Kotlinコード:
class Util {
companion object {
@JvmStatic
fun capitalize(text:String): String {
return text.toUpperCase()
}
}
}
単にあなたはコンパニオンオブジェクトを作成し、それに関数を置く必要があります
class UtilClass {
companion object {
// @JvmStatic
fun repeatIt5Times(str: String): String = str.repeat(5)
}
}
kotlinクラスからメソッドを呼び出すには:
class KotlinClass{
fun main(args : Array<String>) {
UtilClass.repeatIt5Times("Hello")
}
}
またはインポートを使用する
import Packagename.UtilClass.Companion.repeatIt5Times
class KotlinClass{
fun main(args : Array<String>) {
repeatIt5Times("Hello")
}
}
Javaクラスからメソッドを呼び出すには:
class JavaClass{
public static void main(String [] args){
UtilClass.Companion.repeatIt5Times("Hello");
}
}
または@JvmStaticアノテーションをメソッドに追加する
class JavaClass{
public static void main(String [] args){
UtilClass.repeatIt5Times("Hello")
}
}
または、メソッドに@JvmStaticアノテーションを追加し、Javaで静的インポートを行う
import static Packagename.UtilClass.repeatIt5Times
class JavaClass{
public static void main(String [] args){
repeatIt5Times("Hello")
}
}
Androidの場合、単一のアクティビティから必要なすべてのアクティビティまでの文字列を使用します。Javaの静的のように
public final static String TEA_NAME = "TEA_NAME";
Kotlinでの同等のアプローチ:
class MainActivity : AppCompatActivity() {
companion object {
const val TEA_NAME = "TEA_NAME"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
価値が必要な別の活動:
val teaName = MainActivity.TEA_NAME
マイケルアンダーソンの答えを除いて、私は私のプロジェクトで他の2つの方法でコーディングしています。
すべての変数を1つのクラスにホワイト化できます。Constという名前のkotlinファイルを作成しました
object Const {
const val FIRST_NAME_1 = "just"
const val LAST_NAME_1 = "YuMu"
}
KotlinとJavaコードで使用できます
Log.d("stackoverflow", Const.FIRST_NAME_1)
Kotlinの拡張関数を使用して
、Extという名前のkotlinファイルを作成できます。以下のコードは、Extファイル内のすべてのコードです
package pro.just.yumu
/**
* Created by lpf on 2020-03-18.
*/
const val FIRST_NAME = "just"
const val LAST_NAME = "YuMu"
あなたはkotlinコードでそれを使うことができます
Log.d("stackoverflow", FIRST_NAME)
あなたはそれをJavaコードで使うことができます
Log.d("stackoverflow", ExtKt.FIRST_NAME);
それらを直接ファイルに書き込みます。
Java(醜い):
package xxx;
class XxxUtils {
public static final Yyy xxx(Xxx xxx) { return xxx.xxx(); }
}
コトリンでは:
@file:JvmName("XxxUtils")
package xxx
fun xxx(xxx: Xxx): Yyy = xxx.xxx()
これらの2つのコードは、コンパイル後に等しくなります(コンパイルされたファイル名であっても、これはコンパイルされたファイル名file:JvmName
を制御するために使用されます。これはパッケージ名宣言の直前に置く必要があります)。
では、クラスStudentがあります。そして、1つの静的メソッドgetUniversityName()と、totalStudentという1つの静的フィールドがあります。ます。
クラス内でコンパニオンオブジェクトブロックを宣言する必要があります。
companion object {
// define static method & field here.
}
その後、クラスは次のようになります
class Student(var name: String, var city: String, var rollNumber: Double = 0.0) {
// use companion object structure
companion object {
// below method will work as static method
fun getUniversityName(): String = "MBSTU"
// below field will work as static field
var totalStudent = 30
}
}
次に、これらの静的メソッドとフィールドをこのように使用できます。
println("University : " + Student.getUniversityName() + ", Total Student: " + Student.totalStudent)
// Output:
// University : MBSTU, Total Student: 30
kotlinには静的キーワードはありません。kotlin docsは、DRYを追跡したい場合はパッケージレベルの関数を使用することを推奨しています。拡張子が.ktのファイルを作成し、その中にメソッドを配置します。
package p
fun m(){
//fun body
}
コンパイル後、mは public static final voidのます
そして
import p.m
☺
コンパニオンオブジェクトによってKotlinの静的機能を実現できます。
コンパニオンオブジェクトは、クラス外で宣言することはできません。
class MyClass{
companion object {
val staticField = "This is an example of static field Object Decleration"
fun getStaticFunction(): String {
return "This is example of static function for Object Decleration"
}
}
}
コンパニオンオブジェクトのメンバーは、クラス名を修飾子として使用するだけで呼び出すことができます。
出力:
MyClass.staticField // This is an example of static field Object Decleration
MyClass.getStaticFunction() : // This is an example of static function for Object Decleration
多くの人がコンパニオンオブジェクトについて言及していますが、これは正しいです。ただし、ご存知のように、(クラスではなくオブジェクトキーワードを使用して)あらゆる種類のオブジェクトを使用することもできます。
object StringUtils {
fun toUpper(s: String) : String { ... }
}
Javaの静的メソッドと同じように使用します。
StringUtils.toUpper("foobar")
この種のパターンはKotlinでは役に立たないようですが、その長所の1つは、静的メソッドで満たされたクラスの必要性がなくなることです。ユースケースによっては、代わりにグローバル関数、拡張関数、ローカル関数を使用する方が適切です。私が作業している場所では、グローバル拡張関数を、命名規則を使用して別のフラットファイルで定義することがよくあります:[className] Extensions.kt、つまりFooExtensions.kt しかし、より一般的には、オペレーティングクラスまたはオブジェクトの内部で必要な関数を記述します。
関数またはプロパティをインスタンスではなくクラスに関連付ける必要がある場合は、コンパニオンオブジェクト内で宣言できます。
class Car(val horsepowers: Int) {
companion object Factory {
val cars = mutableListOf<Car>()
fun makeCar(horsepowers: Int): Car {
val car = Car(horsepowers)
cars.add(car)
return car
}
}
}
コンパニオンオブジェクトはシングルトンであり、そのメンバーには、含まれているクラスの名前を介して直接アクセスできます。
val car = Car.makeCar(150)
println(Car.Factory.cars.size)
コンパニオンオブジェクトを使用できます-kotlinlang
最初にそのインターフェースを作成することで表示できます
interface I<T> {
}
次に、そのインターフェイス内に関数を作成する必要があります。
fun SomeFunc(): T
その後、クラスが必要です:
class SomeClass {}
そのクラス内では、そのクラス内にコンパニオンオブジェクトが必要です。
companion object : I<SomeClass> {}
そのコンパニオンオブジェクトの内部には古いSomeFunc
関数が必要ですが、それを乗り越える必要があります。
override fun SomeFunc(): SomeClass = SomeClass()
最後に、そのすべての作業の下に、静的関数を強化するための何かが必要です。変数が必要です。
var e:I<SomeClass> = SomeClass()