Académique Documents
Professionnel Documents
Culture Documents
Module GIM21S04
Technologie XML et Technologie Mobile
REDOUANE EZZAHIR
2019/2020
Table de matière
Kotlin en bref 3
Pourquoi Kotlin 3
Android et Kotlin 3
Règles de base 4
Types 4
Références 5
Nullable types 5
Le transtypage (cast) 6
Les fonctions 8
Classes et objets 9
Visibilités 9
Constructeur (Ctor) 10
Héritage 11
Interfaces 12
Classes de données 13
Surcharge d’opérateur 17
Documentation 17
Kotlin en bref
Pourquoi Kotlin
• Google I/O 2017 : langage de premier ordre pour Android
Android et Kotlin
AS 3 est sorti, en version de prévisualisation, tout juste pour la G I/
O 2017 [9]. Il supporte le langage Kotlin. L’avantage est qu’il peut
être installé en parallèle d’une version existante d’AS. Les versions
stable et Canary d’AS partagent alors les dossiers d’installation
(SDK Android et préférences).
D’ailleurs, voici les principaux atouts du support de Kotlin dans AS
3:
Cohabitation du code Java et Kotlin
Conversion automatique du code Java vers Kotlin : Ctrl+C de code
Java Ctrl+V dans un fichier .kt ou Convertir un fichier Java en
Kotlin
Règles de base
• Code contenu dans des fichiers .kt
• cf. https://kotlinlang.org/docs/reference/coding-
conventions.html
Types
• Pas de types primitifs
Références
• val : reférence une valeur constante (immuable)
val answer : Int = 42
• val age = 33; // Type inféré
• val what: String // Type nécessaire si pas
d'initialisation
• what = "Whaaat ?" // Initialisation différée
•
• age += 2 // Erreur, pas modifiable
• Comparaison de références
Nullable types
• Nullable : Double?, String?, …
• Elvis operator : ?:
Le transtypage (cast)
• Savoir si un objet est d’un certain type : is
if (obj is String) {
print(obj.trim())
}
when (x) {
0, 1 -> print("peu")
in 2..10 -> print("moyen")
is String -> print("${x.trim()} est une String")
else -> {
println("rien de tout ça")
print("on peu mettre un block")
}
}
println(
when {
x.isOdd() -> "impair"
x.isEven() -> "pair"
else -> "bizarre"
})
• when et if peuvent êrte utilisées comme expressions : elles
renvoient comme valeur le resultat de leur dernière instruction
exécutée
for (i in 0..9) {
println(i)
}
for (c in "Hello") {
println(c)
}
• Itération avec indices
for (i in array.indices) {
println(array[i])
}
for ((index, value) in array.withIndex()) {
println("The element at $index is $value")
}
• Pour les execptions : comme en Java (sauf qu’il n’existe pas
de notion de checked exception)
Les fonctions
• Possibilité de fonction top level (pas forcément membre d’un
objet)
class Person {
private String name;
private int age;
@Override
public toString() {
return "Person(name=" + name + ", age=" + age + ")";
}
}
• L’équivalent en Kotlin
Visibilités
Modifi
Package Classe
eur
à tout ceux qui voient la
public partout
classe
au sein du fichier
privat au sein de la classe
contenant la
e uniquement
déclaration
intern dans le même module à
dans le même module
al qui voit la classe
protec comme private + dans
—
ted les classes dérivées
• Module : ensemble de fichiers Kotlin compilés ensemble (pour
Android = Gradle source set)
Constructeur (Ctor)
• Constructeur principal
init {
println("My name is: $name");
}
}
• Pour initialisation de propriétés
class Person {
var name = "John Doe";
}
john = Person();
• Accès : john.name (utilisation du getter)
• Syntaxe complète
Héritage
Interfaces
• Comme en Java
interface Named {
val name: String
}
interface A {
fun foo() { print("A") }
}
interface B {
fun foo() { print("B") }
}
class C : A, B {
override fun foo() {
super<A>.foo()
super<B>.foo()
}
}
Classes de données
◦ copy()
• Méthode copy :
fun copy(name: String = this.name, age: Int =
this.age) = User(name, age)
•
• val john = User(name = "John", age = 42)
• val youngJohn = john.copy(age = 22)
button.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { … }
override fun mouseEntered(e: MouseEvent) { … }
})
• Création d’objet sans supertype non trivial
fun foo() {
val local = object {
var x: Int = 0
var y: Int = 0
}
print(local.x + local.y)
print(local::class.simpleName) // affiche null
}
• object comme valeur de retour
class C {
// Private function : the return type is the anonymous
object type
private fun foo() = object { val x: String = "x"}
// Public function : so the return type is Any
fun publicFoo() = object { val x: String = "x" }
fun bar() {
val x1 = foo().x // OK
val x2 = publicFoo().x // ERROR: Unresolved reference
'x'
}
}
• Déclaration d’objet = singletons
• Initialisation thread-safe
object DatabaseManager {
fun connect(conn: Connector) { … }
fun fetchData() : Data { … }
}
• Ne peut pas être du côté droit d’une affectation
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
val square = { num: Int -> num * num }; // (Int) -> Int
val more : (String, Int) -> String = { str, num -> str +
num }
val noReturn : Int -> Unit = { num -> println(num) }
• Pour les lambdas qui ne prennent qu’un paramètre : it
fun String.reverse() =
StringBuilder(this).reverse.toString()
"That's cool !".reverse() // "! looc s'tahT"
• Fonction infixes : infix
◦ Un seul paramètre
Surcharge d’opérateur
• Il est possible de surcharger les opérateurs
• +, -, *, /, %, ..
◦ a + b équivalent à a.plus(b)
• in, !in
◦ a.contains(b)
• Accès indexé []
• Appel de méthode
• a == b
Documentation
• KDoc + génération avec Dokka
• Comme la javadoc
/**
* A group of *members*.
* This class has no useful logic; it's just
* a documentation example.
* @param T the type of a member in this group.
* @property name the name of this group.
* @constructor Creates an empty group.
*/
class Group<T>(val name: String) {
/**
* Adds a [member] to this group.
* @return the new size of the group.
*/
fun add(member: T): Int { ... }
}
Références :
• https://kotlinlang.org/docs/reference/coding-conventions.html
• https://kotlinlang.org/docs/reference/
• https://try.kotlinlang.org/
• http://lprovot.fr/Android/Kotlin.html