Quel est l'équivalent des méthodes statiques Java dans Kotlin?

Il N'y a pas de mot clé static dans Kotlin.

Quelle est la meilleure façon de représenter une méthode Java static dans Kotlin?

328
demandé sur pdeva 2016-11-01 03:52:33

23 réponses

Vous placez la fonction dans "l'objet compagnon".

, Donc le code java comme ceci:

class Foo {
  public static int a() { return 1; }
}

Deviendra

class Foo {
  companion object {
     fun a() : Int = 1
  }
}

Vous pouvez ensuite l'utiliser à partir du code Kotlin comme

Foo.a();

Mais à partir du code Java, vous devez l'appeler comme

Foo.Companion.a();

(qui fonctionne également à partir de Kotlin.)

Si vous n'aimez pas avoir à spécifier le bit Companion, Vous pouvez ajouter une annotation @JvmStatic ou nommer votre classe companion.

De la docs:

Objets Compagnons

Une déclaration d'objet à l'intérieur d'une classe peut être marqué avec le compagnon mot-clé:

class MyClass {
   companion object Factory {
       fun create(): MyClass = MyClass()
   }
}

Les membres de l'objet compagnon peuvent être appelés en utilisant simplement la classe nom comme qualificatif:

val instance = MyClass.create()

...

Cependant, sur la JVM, vous pouvez générer des membres d'objets compagnons en tant que Méthodes et champs statiques réels, si vous utilisez le @JvmStatic annotation. Voir le Java section interopérabilité pour plus de détails.

L'ajout de l'annotation @JvmStatic ressemble à ceci

class Foo {
  companion object {
    @JvmStatic
    fun a() : Int = 1;
  }
}

Et alors il existera comme une vraie fonction statique Java, accessible depuis Java et Kotlin comme Foo.a().

Si c'est juste détesté pour le nom Companion, alors vous pouvez aussi fournir un nom explicite pour l'objet compagnon ressemble à ceci:

class Foo {
  companion object Blah {
    fun a() : Int = 1;
  }
}

Qui vous permettra de l'appeler de Kotlin de la même manière, mais de java comme Foo.Blah.a() (qui fonctionnera également dans Kotlin).

450
répondu Michael Anderson 2018-05-31 17:32:17

Docs recommande de résoudre la plupart des besoins pour les fonctions statiques avec fonctions de niveau paquet. Ils sont simplement déclarés en dehors d'une classe inn un fichier de code source. Le package d'un fichier peut être spécifié au début d'un package avec le mot-clé package.

Déclaration de

package foo

fun bar() = {}

L'Utilisation de

import foo.bar

Sinon

import foo.*

Vous pouvez maintenant appeler la fonction avec:

bar()

, Ou si vous n'utilisez pas l'importation mot-clé:

foo.bar()

Si vous ne spécifiez pas le package, la fonction sera accessible depuis la racine.

Si vous avez de l'expérience avec java, cela peut sembler un peu étrange. La raison en est que kotlin n'est pas un langage strictement orienté objet. Vous pourriez dire qu'il prend en charge les méthodes en dehors des classes.

59
répondu Henrik F. 2017-08-25 18:04:31

1. Définir :

Tout method/ val/ var à l'intérieur de object( mot-clé pour Singleton) agira comme static en java.

Utilisez un companion object Si vous voulez appeler une méthode simplement en utilisant la classe qui contient l'objet.

object Foo{
fun sayFoo() = println("Foo")
val bar ="bar"
}

2. Utilisation :

Foo.sayFoo()
println(Foo.bar)

3. Sortie :

Foo
bar
14
répondu erluxman 2017-08-04 20:46:59

Utiliser object pour représenter val/var/méthode pour faire de l'électricité statique. Vous pouvez également utiliser object au lieu de la classe singleton. Vous pouvez utiliser compagnon, si vous vouliez faire statique à l'intérieur d'une classe

object Abc{
     fun sum(a: Int, b: Int): Int = a + b
    }
13
répondu Asharali V U 2017-11-28 07:23:30

Vous devez passer l'objet compagnon pour la méthode statique car kotlin n'a pas de mot-clé statique-les membres de l'objet compagnon peuvent être appelés en utilisant simplement le nom de classe comme qualificateur:

package xxx
    class ClassName {
              companion object {
                       fun helloWord(str: String): String {
                            return stringValue
                      }
              }
    }
3
répondu Rajesh Dalsaniya 2017-09-27 17:26:46

Kotlin n'a aucun mot-clé statique. Vous avez utilisé cela pour java

 class AppHelper {
        public static int getAge() {
            return 30;
        }
    }

Et Pour Kotlin

class AppHelper {
        companion object {
            fun getAge() : Int = 30
        }
    }

Appel pour Java

AppHelper.getAge();

Appel pour Kotlin

AppHelper.Companion.getAge();

Je pense que cela fonctionne parfaitement.

2
répondu Shohel Rana 2018-01-21 12:56:00

Je voudrais ajouter quelque chose aux réponses ci-dessus.

Oui, vous pouvez définir des fonctions dans des fichiers de code source (en dehors de la classe). Mais il est préférable de définir des fonctions statiques dans la classe en utilisant Companion Object car vous pouvez ajouter plus de fonctions statiques en tirant parti des Extensions Kotlin.

class MyClass {
    companion object { 
        //define static functions here
    } 
}

//Adding new static function
fun MyClass.Companion.newStaticFunction() {
    // ...
}

Et vous pouvez appeler la fonction définie ci-dessus car vous appellerez n'importe quelle fonction à l'intérieur de L'objet compagnon.

2
répondu SVB-knowmywork 2018-07-12 04:52:46
object objectName {
    fun funName() {

    }
}
2
répondu Umesh Maharjan 2018-07-19 05:55:08

Vous devez simplement créer un objet compagnon et y mettre la fonction

  class UtilClass {
        companion object {
  //        @JvmStatic
            fun repeatIt5Times(str: String): String = str.repeat(5)
        }
    }

Pour appeler la méthode à partir d'une classe kotlin:

class KotlinClass{
  fun main(args : Array<String>) { 
    UtilClass.repeatIt5Times("Hello")
  }
}

Ou en utilisant import

import Packagename.UtilClass.Companion.repeatIt5Times
class KotlinClass{
  fun main(args : Array<String>) { 
     repeatIt5Times("Hello")
  }
}

Pour appeler la méthode à partir d'une classe java:

 class JavaClass{
    public static void main(String [] args){
       UtilClass.Companion.repeatIt5Times("Hello");
    }
 }

Ou en ajoutant une annotation @ JvmStatic à la méthode

class JavaClass{
   public static void main(String [] args){
     UtilClass.repeatIt5Times("Hello")
   }
}

Ou les deux en ajoutant l'annotation @JvmStatic à la méthode et en effectuant une importation statique en java

import static Packagename.UtilClass.repeatIt5Times
class JavaClass{
   public static void main(String [] args){
     repeatIt5Times("Hello")
   }
}
1
répondu yasincidem 2018-01-21 11:09:46

Companion Objects est l'alternative du mot-clé java static et vous pouvez rendre une classe ou une méthode statique en les déclarant comme objets Companion.
Vous n'avez pas besoin de qualifier les objets compagnons avec le nom de classe si vous les appelez depuis la même classe.

Par exemple:

class SomeClass() {

    val id: Int

    init {
       id = nextId++       
    }

    private companion object {
       var nextId = 1
    }
}

fun main(args: Array<String>) {
    repeat(2) { 
        println(SomeClass().id)
    }
} 
1
répondu Shubham Mittal 2018-01-29 12:26:31

Vous pouvez utiliser des objets autres que l'objet compagnon

object Utils {
    fun someFunction()
}

Donc, cela ressemblera quand la méthode est appelée.

Utils.someFunction()
1
répondu dr3k 2018-02-13 11:20:51

Créez un objet compagnon et marquez la méthode avec l'annotation jvmstatic

1
répondu 2018-05-05 10:10:56

Cela a également fonctionné pour moi

object Bell {
    @JvmStatic
    fun ring() { }
}

De Kotlin

Bell.ring()

De Java

Bell.ring()
1
répondu Samuel 2018-07-04 01:40:31

Il y a 2 façons d'appliquer la statique dans Kotlin

Créez D'abord un objet compagnon sous la classe

Pour ex:

class Test{
    companion object{
          fun isCheck(a:Int):Boolean{
             if(a==0) true else false
          }
     }
}

Vous pouvez appeler cette fonction comme

Test.Companion.isCheck(2)

Une autre façon que nous pouvons utiliser est de créer une classe d'objets

object Test{
       fun isCheck(a:Int):Boolean{
            if(a==0) true else false
       }
}

Bon Codage!

1
répondu Android Geek 2018-08-27 05:54:02

Écrivez-les directement dans des fichiers.

En Java (laid):

package xxx;
class XxxUtils {
  public static final Yyy xxx(Xxx xxx) { return xxx.xxx(); }
}

Dans Kotlin:

@file:JvmName("XxxUtils")
package xxx
fun xxx(xxx: Xxx): Yyy = xxx.xxx()

Ces deux codes sont égaux après la compilation (même le nom du fichier compilé, le file:JvmName est utilisé pour contrôler le nom du fichier compilé, qui doit être placé juste avant la déclaration du nom du paquet).

0
répondu ice1000 2017-09-27 15:53:58

Utilisez la fonction dans "objet compagnon ou objet nommé".

Voir exemple d'objet compagnon:

   class Foo {
  companion object {
     fun square(x : Int) : Int = x*x
  }
}

Voir l'exemple d'objet nommé

object Foo{
   fun square(x : Int) : Int = x*x
}

Vous pouvez y accéder en utilisant

val k = Foo.square(12)
0
répondu Sabin ks 2018-01-06 19:02:33

Si vous suivez le style d'écriture de la statique en haut de la classe en Java, alors je suggère d'essayer d'envisager de les écrire au niveau supérieur (par exemple avant la déclaration de classe) dans Kotlin. Pour de nombreux cas d'utilisation, cela fonctionne mieux que d'introduire un objet compagnon

Exemple De Code:

class Person {
companion object Test {
    fun callMe() = println("I'm called.")
}


}

fun main(args: Array<String>) { Person.callMe()}

Lorsque vous exécutez le programme, la sortie sera:

On m'appelle.

0
répondu Ranjith Rayapati 2018-02-10 06:37:55

Supposons que vous avez une classe Étudiant. Et vous avez une méthode statique getUniversityName() & un champ appelé totalStudent.

Vous devez déclarer un bloc d'objets compagnon dans votre classe.

    companion object {
 // define static method & field here.
}

Alors votre classe ressemble à

    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
    }
}

Ensuite, vous pouvez utiliser ces méthodes statiques et ces champs comme ceci.

println("University : " + Student.getUniversityName() + ", Total Student: " + Student.totalStudent)
    // Output:
    // University : MBSTU, Total Student: 30
0
répondu Shihab Uddin 2018-02-13 09:18:42

Vous pouvez obtenir la fonctionnalité statique dans Kotlin par objets compagnons

  • Ajout de compagnon à la déclaration d'objet vous permet d'ajouter le statique fonctionnalité à un objet même si la statique réelle le concept n'existe pas dans Kotlin.
  • un objet compagnon {[4] } peut également accéder à tous les membres de la classe, y compris les constructeurs privés.
  • Un compagnon objet est initialisé lorsque la classe est instanciée.
  • Un objetcompagnon ne peut pas être déclaré en dehors de la classe.

    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"
            }
    
        }
    }
    

Les membres de l'objet compagnon peuvent être appelés en utilisant simplement le nom de la classe comme qualificatif:

Sortie:

MyClass.staticField // This is an example of static field Object Decleration

MyClass.getStaticFunction() : // This is an example of static function for Object Decleration
0
répondu Waqar UlHaq 2018-05-03 06:47:41

Tous les membres statiques et la fonction doivent être à l'intérieur du bloc compagnon

  companion object {
    @JvmStatic
    fun main(args: Array<String>) {
    }

    fun staticMethod() {
    }
  }
0
répondu Rahul 2018-06-13 12:27:20

Le code java est comme ci-dessous:

class Foo { public static int a() { return 1; } }

Deviendra comme ci-dessous dans kotlin:

class Foo { companion object { fun a() : Int = 1 } }

Cependant, en utilisant l'annotation @ JvmStatic sur la JVM, nous pouvons avoir des membres d'objets compagnons générés en tant que Méthodes et champs statiques réels.

0
répondu hetsgandhi 2018-07-04 06:01:17

Utiliser L'Annotation statique JVM

Objet compagnon {

    // TODO: Rename and change types and number of parameters
    @JvmStatic
    fun newInstance(param1: String, param2: String) =
            EditProfileFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
}
0
répondu zafar hussain 2018-09-24 06:37:47

Dans la méthode statique java

public static add(){

}

Dans la méthode statique kotlin

fun add():??? {
}
-3
répondu Sach 2018-01-19 14:29:45