Java中的类声明与Kotlin中的类声明
我是Kotlin的新手,我有以下疑问- 使用Java-to-Kotlin转换器(),我将以下Java代码转换为Kotlin Java类:Java中的类声明与Kotlin中的类声明,java,kotlin,Java,Kotlin,我是Kotlin的新手,我有以下疑问- 使用Java-to-Kotlin转换器(),我将以下Java代码转换为Kotlin Java类: public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } p
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;
}
}
生成的Kotlin类:
class Person(name:String, age:Int) {
var name:String
var age:Int = 0
init{
this.name = name
this.age = age
}
}
但是我不明白Java代码和生成的Kotlin代码是如何等价的,因为类数据成员的可见性修饰符从私有(在Java中)更改为公共(在Kotlin中)
我认为,如果可见性修饰符被保留(数据成员在Kotlin中声明为私有),那么getter和setter也必须在Kotlin中创建,并且只有这样它们才应该是等效的。
public
Kotlin中的成员与Java中的public
成员不等效。当被其他Java类访问时,它仍然对公众不可见。您需要在var
前面添加@JvmField
,使其等效于Java中的public
成员
对于Kotlin类Foo{var bar=1}
。要通过Java访问它,new Foo().bar
不会编译。您必须使用newfoo().getBar()
bar
仍然是Java中getter和setter的私有成员
将Kotlin代码更改为
类Foo{@JvmField var bar=1}
,它真正成为Java中的公共成员。然后,您可以通过Java使用new Foo()访问它。在Kotlin中,它隐式地为字段创建getter和setter(Java中也有)。由于这些字段是公共的,因此字段本身实际上是公共的
由于getter和setter的性质(无验证等),使用简单的getter和setter的Java代码实际上相当于使用公共字段
如果您的设置程序执行了空检查和抛出IllegalArgumentException,代码就会不同。对于val
,有getter;对于var
,有setter。读取或更改字段的访问始终通过它们。
在使用java类中的Kotlin类时,可以注意到它们
如果getter或setter描述了默认行为,那么在代码中指出它们是没有意义的
PS:如果您将java类转换为Kotlin类,您会喜欢
class Person(var name: String?, var age: Int)
尽量避免使用链接作为参考,因为它们往往在一段时间后就过时了。实际上,它应该是类人物(var name:String,var age:Int)
。你的Kotlin代码有更多的样板文件。顺便说一句,转换器不是完美的(目前),所以最好是手动,如果你可以。好的。注意到了,哦,是的。它们实际上是公开的。我不是那样想的。非常感谢。