[java] Kotlin에서 Java 정적 메소드에 해당하는 것은 무엇입니까?

없습니다 static코 틀린에 키워드 .

staticKotlin에서 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. 구 자바 웨이 :

  1. companion object정적 메소드 / 변수 를 포함하도록 a 를 선언 하십시오.

    class Foo{
    companion object {
        fun foo() = println("Foo")
        val bar ="bar"
        }
    }
  2. 사용하다 :

    Foo.foo()        // Outputs Foo    
    println(Foo.bar) // Outputs bar


B. 뉴 코 틀린 방식

  1. 파일 에 클래스없는 파일에 직접 선언 .kt하십시오.

    fun foo() = println("Foo")
    val bar ="bar"
  2. 이름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
                      }
              }
    }