Constructeurs en Kotlin

je suis en train d'apprendre Kotlin officielle des docs, j'ai créé un class comme ci-dessous où j'ai créé un constructor qui en a deux parameters. Corps de l' constructorinit bloc.

class Person(name: String, surname: String) {
    init {
        Log.d("App", "Hello");
    }
}

Eh bien, je veux en créer un de plus constructor qui va en prendre un parameter dans un constructor. Quelle est la façon de le faire dans Kotlin

27
demandé sur Pavneet_Singh 2017-05-31 08:20:39

5 réponses

init n'est pas un corps de constructeur. Il est appelé d'après le constructeur primaire avec le contexte du constructeur primaire.

comme indiqué dans la documentation officielle:

le constructeur primaire ne peut contenir aucun code. Le code d'initialisation peut être placé dans les blocs initializer, qui sont préfixés par le mot-clé init:

class Customer(name: String) {
    init {
        logger.info("Customer initialized with value ${name}")
    }
}

notez que les paramètres du constructeur primaire peuvent être utilisés dans les blocs initialiseur. Ils peuvent également être utilisés dans les initialisateurs de propriétés déclarés dans le corps de classe:

class Customer(name: String) {
    val customerKey = name.toUpperCase()
}

en fait, pour déclarer des propriétés et les initialiser à partir du constructeur principal, Kotlin a une syntaxe concise:

class Person(val firstName: String, val lastName: String, var age: Int) {
    // ...
}

selon votre question, vous pouvez ajouter un constructeur pour accepter un paramètre comme suit:

class Person(name: String, surname: String) {

    constructor(name: String) : this(name, "") {
        // constructor body
    }

    init {
        Log.d("App", "Hello");
    }
}

mais il n'a pas l'air bon car nous sommes inutile passer deuxième argument chaîne vide. Si nous pouvons commander constructeur comme suit:

class Person(name: String) {

    constructor(name: String, surname: String) : this(name) {
        // constructor body
    }

    init {
        Log.d("App", "Hello");
    }
}

j'Espère que ça aide.

35
répondu chandil03 2017-05-31 05:47:28

Première façon de le faire avec des valeurs vides

// (name: String, surname: String)  default constructor signature
class Person(name: String, surname: String) {

    // init block , represents the body of default constructor 
    init {
        Log.d("primary", "Hello");
    }

    // secondary constructor 
    // this(name,"") call to default constructor
    constructor(name : String):this(name,""){
        Log.d("secondary", "Hello");
    }
}

pourquoi this(name,"")

Si la classe possède un constructeur, chaque deuxième constructeur besoin de déléguer au constructeur principal, soit directement, soit indirectement par l'intermédiaire d'un autre secondaire constructeur(s). Délégation à un autre constructeur de la même classe est fait en utilisant le mot-clé suivant:

ou

kotlin, ne permettra pas d'utiliser nullthis(name,null) donc utiliser ? pour représenter null valeurs avec type,surname: String?

class Person(name: String, surname: String?) {

    init {
        Log.d("primary", "Hello");
    }

    constructor(name : String):this(name,null){
        Log.d("secondary", "Hello");
    }
}
3
répondu Pavneet_Singh 2017-05-31 06:37:40

dans la classe utiliser constructor mot clé pour créer secondaire constructeur. Comme:

class Person(name: String, surname: String) {
    init {
        Log.d("App", "Hello");
    }
    constructor(id: Int) {

    }
}

Pour plus d'informations, consultez Constructeurs Secondaires

EDIT:

la Règle : si la classe a un constructeur primaire, chaque constructeur secondaire doit déléguer au constructeur primaire, soit directement, soit indirectement par l'intermédiaire d'un autre constructeur secondaire. La délégation à un autre constructeur de la même classe est fait en utilisant le mot-clé this.

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

donc quand vous appelez le constructeur secondaire, il appelle le constructeur primaire pour initialiser le nom et ensuite vous faites votre truc dans le constructeur secondaire. Dans l'exemple ci-dessus le nom est initialisé par l'appel principal constructeur.

2
répondu Akshay Bhat 'AB' 2017-05-31 05:39:03

Constructeurs Secondaires

la classe peut aussi déclarer les constructeurs secondaires, qui sont préfixés avec le constructeur:

class Person {
    constructor(parent: Person) {
        parent.children.add(this)
    } } 

si la classe a un constructeur primaire, chaque constructeur secondaire doit déléguer au constructeur primaire, soit directement, soit indirectement par l'intermédiaire d'un autre constructeur secondaire. La délégation à un autre constructeur de la même classe est faite en utilisant le mot-clé suivant:

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    } }

voir https://kotlinlang.org/docs/reference/classes.html Secondaire Constructeurs partie

1
répondu Solo 2017-05-31 05:26:39

c'est ainsi que vous créez un autre constructeur.

class Person(name: String, surname: String) {
    init {
        Log.d("App", "Hello");
    }
 constructor(id: Int) : this("example name", "example surname") {

}
}

rappelez-vous toujours que le constructeur secondaire devra référencer le constructeur primaire et ses paramètres en utilisant ce mot-clé.

1
répondu Alf Moh 2017-06-06 14:14:17