1086 votes

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

Il n'y a pas static en Kotlin.

Quelle est la meilleure façon de représenter un static Méthode Java en Kotlin ?

11 votes

38 votes

Faites attention : Kotlin a supprimé les statiques de style Java pour encourager des pratiques de codage plus faciles à maintenir (j'ose dire "meilleures"). Les globaux statiques vont généralement à l'encontre du paradigme de la POO, mais ils peuvent être très pratiques. Par conséquent, Kotlin nous a fourni compagnons, une façon plus conviviale d'avoir des statiques.

0 votes

Kotlin est désormais le langage préféré pour le développement d'Android, selon Google.

1493voto

Michael Anderson Points 21181

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

Donc le code java est comme ceci :

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

deviendra

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

Vous pouvez ensuite l'utiliser à l'intérieur du code Kotlin en tant que

Foo.a();

Mais dans le code Java, vous devrez l'appeler en tant que

Foo.Companion.a();

(Ce qui fonctionne également à partir de Kotlin).

Si vous n'aimez pas avoir à spécifier l'option Companion vous pouvez soit ajouter un @JvmStatic ou nommez votre classe d'accompagnement.

De la docs :

Objets compagnons

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

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

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

val instance = MyClass.create()

...

Cependant, sur la JVM, vous pouvez avoir des membres d'objets compagnons générés en tant que méthodes et champs statiques réels, si vous utilisez l'attribut @JvmStatic annotation. Voir le Interopérabilité de Java pour plus de détails.

Ajout de la @JvmStatic ressemble à ceci

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

et elle existera alors comme une véritable fonction statique Java, accessible à partir de à la fois de Java et de Kotlin comme Foo.a() .

Si elle n'est pas appréciée uniquement pour le Companion vous pouvez également 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 depuis Kotlin de la même manière, mais depuis java comme Foo.Blah.a() (qui fonctionnera également en Kotlin).

7 votes

En Kotlin, ce sera fun a(): Int { return 1 } ou même fun a(): Int = 1

13 votes

@DmitryZaitsev o même fun a() = 1 .

0 votes

Que veut dire l'usine ?

249voto

Henrik F. Points 786

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

Déclaration

package foo

fun bar() = {}

Utilisation

import foo.bar

Ou bien

import foo.*

Vous pouvez maintenant appeler la fonction avec :

bar()

ou si vous n'utilisez pas le mot-clé import :

foo.bar()

Si vous ne spécifiez pas le paquet, la fonction sera accessible à partir de la racine.

Si vous n'avez que 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. On pourrait dire qu'il supporte les méthodes en dehors des classes.

Modifier : Ils ont modifié la documentation pour ne plus inclure la phrase concernant la recommandation de fonctions au niveau du paquet. Este est l'original auquel il a été fait référence ci-dessus.

10 votes

Notez que sous le capot, ces fonctions de "haut niveau" ou de "package" sont en fait compilées dans leur propre classe. Dans l'exemple ci-dessus, le compilateur créerait une classe class FooPackage avec toutes les propriétés et fonctions de haut niveau, et acheminez toutes vos références vers elles de manière appropriée. Plus d'informations de jetbrains.

57 votes

+1 Pour avoir expliqué comment faire l'équivalent correctement en Kotlin plutôt que de se contenter de l'équivalent miroir de Java.

2 votes

Ceci devrait être la réponse acceptée ou un mod devrait mettre à jour la réponse acceptée pour contenir les fonctions au niveau du paquet.

63voto

A. Old Java Way :

  1. Déclarer un companion object pour enfermer un méthode / variable

    class Foo{
    companion object {
        fun foo() = println("Foo")
        val bar ="bar"  
        }
    }
  2. Utilisez :

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


B. Nouvelle voie Kotlin

  1. Déclarer directement sur le fichier sans classe sur un .kt fichier.

    fun foo() = println("Foo")
    val bar ="bar"
  2. Utilisez le methods/variables avec leur noms . ( Après les avoir importés )

    Utilisez :

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

0 votes

Si j'essaie d'initialiser dans une autre classe, cela donne java.lang.ExceptionInInitializerError et j'utilise var au lieu de val.

4 votes

Les appels de méthode doivent avoir le INSTANCE mot-clé, comme ceci : Foo.INSTANCE.sayFoo()

0 votes

Je pense que cette solution est la plus adaptée si vous voulez une static CLASS pas seulement static methdos . En effet, avec les objets compagnons, vous pouvez toujours instancier la classe parent.

44voto

Asharali V U Points 328

Utilisez objet pour représenter val/var/méthode pour rendre statique. Vous pouvez également utiliser un objet au lieu d'une classe singleton. Vous pouvez utiliser compagnon si vous vouliez faire du statique à l'intérieur d'une classe

object Abc{
     fun sum(a: Int, b: Int): Int = a + b
    }

Si vous devez l'appeler depuis Java :

int z = Abc.INSTANCE.sum(x,y);

En Kotlin, ignorez INSTANCE.

0 votes

C'est ce que je cherchais, merci :D

6voto

Rajesh Dalsaniya Points 525

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

package xxx
    class ClassName {
              companion object {
                       fun helloWord(str: String): String {
                            return stringValue
                      }
              }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X