Инициализировать список объектов конструктора - PullRequest
0 голосов
/ 19 ноября 2018

Я изучаю kotlin, и я хочу узнать, как реализовать следующий код от java до kotlin:

private Question[] questions = new Question[] {
    new Question(R.string.question_a, true)
    new Question(R.string.question_b, false)
};

public class Question {

  private int resultId;
  private boolean answerT;

  public Question(int resId, boolean theAnswer) {
    resultId = resId;
    answerT = theAnswer'
  }
}

Котлин:

class Question {
    private var resultId:Int  = 0
    private var answerT:Boolean = false

    fun Question(resId:Int, theAnswer:Boolean) {
        resultId = resId
        answerT = theAnswer
    }
}

....
private val questions:List<Question> {
    Question(R.string.question_a, true),
    Question(R.string.question_b, false)
}

Я не уверен, как инициализировать в kotlin.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Прежде всего, вы используете конструкторы в стиле Java. Конструкторы Kotlin обозначаются ключевым словом constructor или с использованием первичных конструкторов (круглые скобки после имени класса). fun ClassName - это не то, как конструкторы объявляются в Kotlin.

Причина, по которой я указываю на это, заключается в том, что вы не сможете правильно инициализировать свой класс, если у вас нет прав конструкторов.

У вас есть два варианта: во-первых, используются вторичные конструкторы:

constructor(resId: Int, theAnswer: Boolean) {
    resultId = resId
    answerT = theAnswer
}

Второй использует основной:

class Question(var resId: Int, var theAnswer: Boolean) { // these might be val instead; change these if you don't change the vars. you can also remove the brackets if you don't have a class body.
}

Использование var или val в первичных конструкторах также объявляет их для класса. Если вы не используете var или val, они доступны только в блоке init или для инициализации переменных (до тех пор, пока не будет выполнена инициализация класса, как в конструкторах). Вы можете сравнить, используя var или val, также добавив this.someField = someField, где, как и раньше, он просто используется в конструкторе.


Также обратите внимание, что вторичные конструкторы обязаны вызывать первичный конструктор, если таковой существует. Вам также понадобятся первичные конструкторы для некоторых классов, которые требуют передачи определенных полей, которые вы не можете инициализировать напрямую, будь то потому, что для работы требуется конкретный экземпляр, или это одноэлементная реализация абстрактного класса или интерфейса.


Что касается списка, это зависит от того, как вы хотите это сделать. Ваш код Java использует массивы, а не списки. Для списков вы используете listOf(items), а для массивов вы можете arrayOf. arrayOf() работает точно так же, как listOf, за исключением того, что возвращает Question[], а не List<Question>. Правильная инициализация списка (или массива) выглядит следующим образом:

val questions = listOf (Вопрос (R.string.question_a, true), ...)

listOf принимает аргумент vararg элементов, так что вы также можете создавать пустые списки или массивы, подобные этому (хотя для пустых массивов это немного бессмысленно).

Типы также автоматически выводятся, поэтому вам не нужно явно вводить : List<Question> или listOf<Question>(...). Вам нужно явно объявить их, если вы не передаете никаких аргументов.

Также есть возможность добавить его вручную, если вам так хочется. Например, вы можете инициализировать списки напрямую и вызывать .add для них.

0 голосов
/ 19 ноября 2018

Почему ты не можешь пойти с enum class?

enum class Question(val resultId:Int, val answerT:Boolean) {
    A(R.string.question_a, true),
    B(R.string.question_b, false)
}

или эквивалентный код для kotlin (я могу думать),

class Question(val resultId:Int, val answerT:Boolean)
val questionList = listOf(Question(R.string.question_a,true), Question(R.string.question_b, false))
0 голосов
/ 19 ноября 2018

Вы можете использовать метод listOf:

private val questions: List<Question> = listOf(
    Question(R.string.question_a, true),
    Question(R.string.question_b, false))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...