初始化构造函数对象列表

时间:2018-11-19 14:51:49

标签: kotlin

我正在学习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'
  }
}

kotlin:

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 :(得分:2)

您可以使用listOf方法:

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

答案 1 :(得分:2)

首先,您正在使用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.
}

在主要构造函数中使用varval也会为类声明它们。如果您不使用varval,则它们仅在init块中可用,或仅用于变量初始化(直到完成类的初始化为止,就像在构造函数中一样) )。您可以使用varval进行比较,也可以添加this.someField = someField,在没有构造函数的情况下,它只是不使用。


还请注意,如果存在二级构造函数,则必须调用二级构造函数。对于某些类,您还需要主要的构造函数,这些类需要传递无法直接初始化的特定字段,这是因为它需要特定的实例才能工作,或者是抽象类或接口的单例实现。


至于列表,取决于您的操作方式。您的Java代码使用数组,而不是列表。但是,对于列表,您使用listOf(items);对于数组,您可以使用arrayOfarrayOf()的工作原理与listOf类似,但它返回的是Question[],而不是List<Question>。列表(或数组)的正确初始化是这样的:

val问题= listOf(Question(R.string.question_a,true),...)

listOf带有项的vararg参数,因此您还可以创建类似这样的空列表或数组(尽管对于空数组而言,这毫无意义)。

类型也会被自动推断,因此您无需显式键入: List<Question>listOf<Question>(...)。如果不传递任何参数,则需要显式声明它们。

如果您愿意,也可以选择手动添加。对于一个实例,您可以直接初始化列表,并在其上调用.add

答案 2 :(得分:0)

您为什么不能选择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))