Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kotlin中数据类中的私有成员变量_Java_Android_Kotlin_Kotlin Android Extensions - Fatal编程技术网

Java Kotlin中数据类中的私有成员变量

Java Kotlin中数据类中的私有成员变量,java,android,kotlin,kotlin-android-extensions,Java,Android,Kotlin,Kotlin Android Extensions,我是kotlin的新手,当我阅读kotlin中的数据类时,我发现了这些代码。这基本上是java模型类和kotlin数据类之间的比较,在那里,wriiten认为这两个代码都执行相同的任务 代码1 public class VideoGame { private String name; private String publisher; private int reviewScore; public VideoGame(String name, String publisher, int re

我是kotlin的新手,当我阅读kotlin中的数据类时,我发现了这些代码。这基本上是java模型类和kotlin数据类之间的比较,在那里,wriiten认为这两个代码都执行相同的任务

代码1

public class VideoGame {

private String name;
private String publisher;
private int reviewScore;

public VideoGame(String name, String publisher, int reviewScore) {
    this.name = name;
    this.publisher = publisher;
    this.reviewScore = reviewScore;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPublisher() {
    return publisher;
}

public void setPublisher(String publisher) {
    this.publisher = publisher;
}

public int getReviewScore() {
    return reviewScore;
}

public void setReviewScore(int reviewScore) {
    this.reviewScore = reviewScore;
}}
代码2

data class VideoGame(val name: String, val publisher: String, var reviewScore: Int)

我的问题是,在数据类中,所有变量都是公共的,而不是私有的,任何人都可以借助该类的对象直接访问该变量,但在java代码中,所有变量都是私有的,这就是为什么我们必须为这些成员变量编写getter和setter,如果它是公共的,则不需要getter和setter。那么这些代码是如何相同的呢?

数据类的主要用途是简化编写工作

如果您进入IDE并编写
视频游戏
课程:

data-class视频游戏(val-name:String,val-publisher:String,var-reviewScore:Int)
然后反编译它:

IDE工具栏>工具>Kotlin>显示Kotlin字节码>反编译

你得到这个:

@元数据(
mv={1,1,16},
bv={1,0,3},
k=1,
d1={“\u0000\”\\n\n\u0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 u0012\u0006\u0010\u0005\u001a\u00020\u0006\u0006\u0002\u0010\u0007J\t\u0010\u0010\u0010\U0000\U0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20\u0006HÆ\u0001J\u0013\u0010\u0013\u001a\u00020\u00142\b\u0010\u0015\uu0004\u0004\u0004\u0004\u0004\u0018\u0010\u0010\u0010\u0016\u0016\u0016\u00010\u00020\u00010\u0004\u0004\u0004\u0004\u0004\u0004\u0004\u0004\u0004\u0010\u0010\u0010\u0016\u0016\u0016\u00010\u00010\u00010\u00010\u00010\u00010\u00020\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\U0\tR\u001a\u0010\u0005\u001a\u00020\u0006X\u0086\u000e\u0006\u000e\n\u0000\u001a\u0004\b\u000b\u0010\f\“\u0004\b\r\u0010\u000e¨\u0006\u0018”},
d2={“Lcom/yourpackage/VideoGame;”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”(Ljava/lang/String;Ljava/lang/String;I)V、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、
)
公开期末课电子游戏{
@NotNull
私有最终字符串名;
@NotNull
私有最终字符串发布器;
私人int reviewScore;
@NotNull
公共最终字符串getName(){
返回此.name;
}
@NotNull
公共最终字符串getPublisher(){
返回此.publisher;
}
公共最终int GetReviewCore(){
返回此.reviewScore;
}
公共最终作废SetReviewCore(int var1){
this.reviewScore=var1;
}
公共视频游戏(@NotNull字符串名称,@NotNull字符串发布者,int-reviewScore){
Intrinsics.checkParametersNotNull(名称,“名称”);
Intrinsics.checkParameterisNotFull(发布者,“发布者”);
超级();
this.name=名称;
this.publisher=publisher;
this.reviewScore=reviewScore;
}
@NotNull
公共最终字符串组件1(){
返回此.name;
}
@NotNull
公共最终字符串组件2(){
返回此.publisher;
}
公共最终整型组件3(){
返回此.reviewScore;
}
@NotNull
公开最终视频游戏副本(@NotNull String name、@NotNull String publisher、int reviewScore){
Intrinsics.checkParametersNotNull(名称,“名称”);
Intrinsics.checkParameterisNotFull(发布者,“发布者”);
返回新的视频游戏(名称、出版商、ReviewCore);
}
//$FF:合成法
公共静态视频游戏副本$default(视频游戏var0、字符串var1、字符串var2、int var3、int var4、对象var5){
如果((变量4和1)!=0){
var1=var0.name;
}
如果((变量4和2)!=0){
var2=var0.0;
}
如果((变量4和4)!=0){
var3=var0.reviewScore;
}
返回var0.copy(var1,var2,var3);
}
@NotNull
公共字符串toString(){
return“VideoGame(name=“+this.name+”,publisher=“+this.publisher+”,reviewScore=“+this.reviewScore+”);
}
公共int hashCode(){
字符串var10000=this.name;
int var1=(var10000!=null?var10000.hashCode():0)*31;
字符串var10001=this.publisher;
返回(var1+(var10001!=null?var10001.hashCode():0))*31+this.reviewScore;
}
公共布尔等于(@Nullable Object var1){
if(this!=var1){
if(视频游戏的var1实例){
视频游戏var2=(视频游戏)var1;
if(Intrinsics.areEqual(this.name,var2.name)&&Intrinsics.areEqual(this.publisher,var2.publisher)&&this.reviewScore==var2.reviewScore){
返回true;
}
}
返回false;
}否则{
返回true;
}
}
}
因此,支持字段是私有的。科特林正在为你做所有繁琐繁重的工作。即:

  • 使用getter和setter支持字段
  • toString的基本实现
  • 实现
    等于
  • hashCode
  • 注释可空性
  • 编写构造函数实现
  • 添加有用的
    copy
    方法
  • 你得到了一个惊人的82行臃肿的代码,你可能会自己编写(可能会洒一些错误?)在Java中交换1个关键字。是不是很棒

    如此快速的回顾
    • 数据类
      简化POJO的编写
    • val