我是科特林的新手,并且我有以下疑问-
使用 Java到Kotlin转换器(this Link),我将以下 Java代码转换为 Kotlin 。
Java类:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
科特林产生的阶级:
class Person(name:String, age:Int) {
var name:String
var age:Int = 0
init{
this.name = name
this.age = age
}
}
但是我不明白 Java代码和生成的 Kotlin代码是如何等效的,因为类数据成员的可见性修饰符从 private < / strong>(在Java中)为公开(在Kotlin中)。
我相信,如果保留可见性修饰符(在Kotlin中将数据成员声明为私有),则也必须在Kotlin中创建getter和setter,只有这样它们才是等效的。
答案 0 :(得分:1)
在Kotlin中,它隐式地为字段创建getter和setter(在Java中也是如此)。由于这些字段是公共的,因此这些字段本身也将有效地变为公共字段。
实际上,由于getter和setter的性质(没有验证等),具有简化的getter和setter的Java代码相当于具有公共字段。
如果您的设置员完成了例如空检查和引发的IllegalArgumentExceptions,则代码将有所不同。
答案 1 :(得分:0)
public
成员不等同于Java中的public
成员。当被其他Java类访问时,它仍然对公众不可见。您需要在@JvmField
前面添加var
,以使其等效于Java中的public
成员。
对于Kotlin class Foo { var bar = 1 }
。要通过Java访问它,new Foo().bar
不会编译。您必须使用new Foo().getBar()
。从Java的角度来看,bar
仍然是具有getter和setter的私有成员。
将Kotlin代码更改为class Foo { @JvmField var bar = 1 }
,它真正成为Java的公共成员。然后,您可以使用new Foo().bar
答案 2 :(得分:0)
在val
的情况下有吸气剂,在var
的情况下有吸气剂。始终通过它们访问字段以进行读取或更改。
使用java类中的Kotlin类时,您会注意到它们。
如果getter或setter描述了默认行为,则将它们指向代码是没有道理的。
PS:如果您将Java类转换为Kotlin类,将会
class Person(var name: String?, var age: Int)