[java] Kotlin에서 Java 정적 메소드에 해당하는 것은 무엇입니까?
없습니다 static
코 틀린에 키워드 .
static
Kotlin에서 Java 메소드 를 나타내는 가장 좋은 방법은 무엇입니까 ?
답변
“companion object”에 함수를 배치합니다.
따라서 자바 코드는 다음과 같습니다.
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
려면 주석을 추가 하거나 컴패니언 클래스의 이름 을 지정할 수 있습니다 .
로부터 문서 :
동반자 객체
클래스 내부의 객체 선언은 companion 키워드로 표시 할 수 있습니다.
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와 Kotlin에서 모두로 액세스 할 수있는 실제 Java 정적 함수로 존재합니다 Foo.a()
.
Companion
이름이 마음에 들지 않으면 다음과 같이 컴패니언 객체에 대한 명시 적 이름을 제공 할 수도 있습니다.
class Foo {
companion object Blah {
fun a() : Int = 1;
}
}
같은 방식으로 Kotlin에서 호출 할 수 있지만 java와 같은 Foo.Blah.a()
(Kotlin에서도 작동 함).
답변
Docs 는 패키지 수준 함수를 사용 하여 정적 함수에 대한 대부분의 요구를 해결하는 것이 좋습니다 . 그것들은 단순히 소스 코드 파일의 클래스 외부에서 선언됩니다. 파일의 패키지는 파일 시작 부분에서 package 키워드를 사용하여 지정할 수 있습니다.
선언
package foo
fun bar() = {}
용법
import foo.bar
대안 적으로
import foo.*
이제 다음을 사용하여 함수를 호출 할 수 있습니다.
bar()
또는 import 키워드를 사용하지 않는 경우 :
foo.bar()
패키지를 지정하지 않으면 루트에서 기능에 액세스 할 수 있습니다.
자바 경험 만 있다면 조금 이상하게 보일 수 있습니다. 그 이유는 kotlin이 객체 지향 언어가 아니기 때문입니다. 클래스 외부의 메소드를 지원한다고 말할 수 있습니다.
편집 : 더 이상 패키지 레벨 기능 권장에 대한 문장을 포함하지 않도록 문서를 편집했습니다. 이것은 위에서 언급 한 원본입니다.
답변
A. 구 자바 웨이 :
-
companion object
정적 메소드 / 변수 를 포함하도록 a 를 선언 하십시오.class Foo{ companion object { fun foo() = println("Foo") val bar ="bar" } }
-
사용하다 :
Foo.foo() // Outputs Foo println(Foo.bar) // Outputs bar
B. 뉴 코 틀린 방식
-
파일 에 클래스 가 없는 파일에 직접 선언
.kt
하십시오.fun foo() = println("Foo") val bar ="bar"
-
이름
methods/variables
과 함께를 사용하십시오 . ( 가져온 후 )사용하다 :
foo() // Outputs Foo println(bar) // Outputs bar
답변
정적을 만들기 위해 val / var / method를 나타 내기 위해 object 를 사용하십시오 . 싱글 톤 클래스 대신 객체를 사용할 수도 있습니다. 클래스 안에서 정적으로 만들고 싶다면 컴패니언 을 사용할 수 있습니다
object Abc{
fun sum(a: Int, b: Int): Int = a + b
}
Java에서 호출해야하는 경우 :
int z = Abc.INSTANCE.sum(x,y);
코 틀린에서는 INSTANCE를 무시하십시오.
답변
이것은 또한 나를 위해 일했다
object Bell {
@JvmStatic
fun ring() { }
}
코 틀린에서
Bell.ring()
자바에서
Bell.ring()
답변
object objectName {
fun funName() {
}
}
답변
kotlin에는 정적 키워드가 없으므로 정적 메소드에 대해 컴패니언 객체를 전달해야합니다. 컴패니언 객체의 멤버는 클래스 이름을 한정자로 사용하여 호출 할 수 있습니다.
package xxx
class ClassName {
companion object {
fun helloWord(str: String): String {
return stringValue
}
}
}