如何在Kotlin中编写吸气剂和吸气剂?

时间:2020-06-08 09:24:16

标签: java kotlin constructor

我是Kotlin的新手,正在构建测验应用程序。我不明白如何将此Java代码写入Kotlin?尤其是吸气剂和吸气剂?还有如何在Kotlin中创建默认构造函数和参数化构造函数?

我所做的是这样:

class Question {

    var question: String
    var opt1: String
    var opt2: String
    var opt3: String
    var answerno: Int

    constructor(question: String, opt1: String, opt2: String, opt3: String, answerno: Int) {
        this.question = question
        this.answerno = answerno
        this.opt1 = opt1
        this.opt2 = opt2
        this.opt3 = opt3
    }
}

此处的Java代码:

public class Question {
    private String question;
    private String option1;
    private String option2;
    private String option3;
    private int answerNr;
    public Question() {
    }
    public Question(String question, String option1, String option2, String option3, int answerNr) {
        this.question = question;
        this.option1 = option1;
        this.option2 = option2;
        this.option3 = option3;
        this.answerNr = answerNr;
    }
    public String getQuestion() {
        return question;
    }
    public void setQuestion(String question) {
        this.question = question;
    }
    public String getOption1() {
        return option1;
    }
    public void setOption1(String option1) {
        this.option1 = option1;
    }
    public String getOption2() {
        return option2;
    }
    public void setOption2(String option2) {
        this.option2 = option2;
    }
    public String getOption3() {
        return option3;
    }
    public void setOption3(String option3) {
        this.option3 = option3;
    }
    public int getAnswerNr() {
        return answerNr;
    }
    public void setAnswerNr(int answerNr) {
        this.answerNr = answerNr;
    }
}

6 个答案:

答案 0 :(得分:1)

在kotlin getter和setter由编译器自动生成的情况下,您可以将所有变量写入构造函数。这将为此处的字段生成所有的获取器和设置器。

class Question (
    var question: String
    var opt1: String
    var opt2: String
    var opt3: String
    var answerno: Int
)

如果要提供自定义的getter或setter,只需在类内创建属性:

class Question (
    question: String
    var opt1: String
    var opt2: String
    var opt3: String
    var answerno: Int
) {
    var question = question
        get() {
            // getter code (use field variable here to access this variable)
        }
        set(value) {
            // assign value to field variable, like `field = value`
        }
}

答案 1 :(得分:0)

我建议您阅读kotlin文档以创建模型类。这里有一些很好的解释。 https://kotlinlang.org/docs/reference/properties.html

看看下面的普通对象类。

class Question {
  var question:String
  var option1:String
  var option2:String
  var option3:String
  var answerNr:Int = 0
  constructor() {}
  constructor(question:String, option1:String, option2:String, option3:String, answerNr:Int) {
    this.question = question
    this.option1 = option1
    this.option2 = option2
    this.option3 = option3
    this.answerNr = answerNr
  }
}

如果您正在寻找数据类,请尝试以下方法

data  class Question (
  var question:String,
  var option1:String,
  var option2:String,
  var option3:String,
  var answerNr:Int = 0
) {  
}

答案 2 :(得分:0)

如果您想要与Java类完全相同的结构,那么这里介绍的是带有所有“空值”的转换后的解决方案:

android {
  ...
  defaultConfig {...}
  buildTypes {...}

  compileOptions {
      sourceCompatibility JavaVersion.VERSION_1_8
      targetCompatibility JavaVersion.VERSION_1_8
  }
}

感谢@gidds,指出Kotlin默认为每个class属性生成getter和setter(用于可变属性)。

属性不是私有的,因此声明为const { Readable } = require('stream'); class BufferStream extends Readable { constructor ( buffer ){ super(); this.buffer = buffer; } _read (){ this.push( this.buffer ); this.push( null ); } } function bufferToStream( buffer ) { return new BufferStream( buffer ); } ,因为: -(class Question { var question: String? = null var option1: String? = null var option2: String? = null var option3: String? = null var answerNr = 0 constructor() {} constructor( question: String?, option1: String?, option2: String?, option3: String?, answerNr: Int ) { this.question = question this.option1 = option1 this.option2 = option2 this.option3 = option3 this.answerNr = answerNr } } )您的Java代码中每个属性都有getter和setter; -(不是私有的)您的getter和setter只需返回并设置值,而无需更改它们。

例如,如果varvar使用getQuestion值执行一些计算并返回计算结果,则转换后的类将如下所示:

setQuestion

那是最直接的转换。

答案 3 :(得分:0)

get() = field        // getter 
        set(value) {         // setter 
            field = value 
        } 

例如:-

get() = question
set(value){
question = value
}

答案 4 :(得分:0)

您可以使用Kotlin Data classes避免使用吸气剂/阻气剂样板。

您还可以在Companion objects中用Fabric方法替换构造函数。关于该主题的更多信息,您可以在书Effective Java中找到“项目1:考虑静态工厂方法而不是构造函数”和here

另一个有用的数据类功能是copy-methods。使用它们,您可以避免创建可变对象。 Immutable objects have a lot advantages over mutable。例如,在multithreading programming中使用不可变的对象是安全的。

data class Question(
    val question: String,
    val opt1: String,
    val opt2: String,
    val opt3: String,
    val answerno: Int
) {
    companion object {

        // Fabric methods in companion objects as replace to secondary constructors
        fun fromQuestion(question: String) = Question(
            question = question,
            opt1 = "",
            opt2 = "",
            opt3 = "",
            answerno = 0
        )
    }
}

// Using Companion object fabric method
val myQuestion = Question.fromQuestion("question")

// Avoid mutable objects with copy method
val newQuestion = myQuestion.copy(
    question = "New question"
)

答案 5 :(得分:0)

您不需要分配getter setter,因为默认情况下它在那里。您可以使用question.option1访问它们。

您可以这样使用

class Question(
    var question: String = "default value",
    var option1: String = "default value",
    var option2: String = "default value",
    var option3: String = "default value",
    var answerNr: Int = 0
)

这样,您可以分配默认值。