我是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;
}
}
答案 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只需返回并设置值,而无需更改它们。
例如,如果var
和var
使用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
)
这样,您可以分配默认值。